我理解malloc()的工作原理.我的问题是,我会看到这样的事情:

#define A_MEGABYTE (1024 * 1024)

char *some_memory;
size_t size_to_allocate = A_MEGABYTE;
some_memory = (char *)malloc(size_to_allocate);
sprintf(some_memory, "Hello World");
printf("%s\n", some_memory);
free(some_memory);

为简洁起见,我省略了错误判断.我的问题是,难道不能通过初始化内存中某个静电存储的指针来完成上述操作吗?也许:

char *some_memory = "Hello World";

在什么情况下,您实际上需要自己分配内存,而不是声明/初始化需要保留的值?

推荐答案

char *some_memory = "Hello World";

正在创建指向字符串常量的指针.这意味着字符串"Hello World"将位于内存的只读部分的某个地方,您只需要有一个指向它的指针.您可以将该字符串用作只读.你可以对它进行修改.例子:

some_memory[0] = 'h';

这是自找麻烦.

另一方面

some_memory = (char *)malloc(size_to_allocate);

正在分配一个字符数组(变量),而SOME_MEMORY指向所分配内存.现在,该数组既是读的,也是写的.您现在可以执行以下操作:

some_memory[0] = 'h';

数组内容变为"hello World"

C++相关问答推荐

为什么这个select()会阻止?

找出文件是否包含给定的文件签名

标准的C17标准是用括号将参数包装在函数声明中吗

C语言中的strstr问题

为什么cudaFree不需要数据 struct 的地址?

为静态库做准备中的奇怪行为

如何在POSIX-UEFI中获得输入?

强制转换变量以在 struct 中蚕食

在vfork()之后,链接器如何在不 destruct 父内存的情况下解析execve()?

将多项式从文件.txt加载到终端时出现问题

搜索使用int代替time_t的用法

从CentOS 7到Raspberry PI 2B的交叉编译-无法让LIBC和System Include标头一起工作

C++中PUTS函数的返回值

在运行时判断C/C++指针是否指向只读内存(在Linux操作系统中)

C中的char**v*char[]

在C中打印指针本身

从文件到链表读取日期

为什么程序在打印每个数字之前要等待所有输入?

创建 makefile 来编译位于不同目录中的多个源文件

我们可以在不违反标准的情况下向标准函数声明添加属性吗?