首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C中什么时候应该使用malloc,什么时候不应该使用呢?

在C中什么时候应该使用malloc,什么时候不应该使用呢?
EN

Stack Overflow用户
提问于 2009-12-27 00:51:57
回答 4查看 73.4K关注 0票数 95

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

代码语言:javascript
复制
#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);

为了简洁起见,我省略了错误检查。我的问题是,你不能通过初始化一个指向内存中一些静态存储的指针来做上面的事情吗?也许:

代码语言:javascript
复制
char *some_memory = "Hello World";

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

EN

回答 4

Stack Overflow用户

发布于 2009-12-27 00:57:38

就这个例子而言,malloc用处不大。

需要malloc的主要原因是当您的数据必须具有与代码作用域不同的生命周期时。您的代码在一个例程中调用malloc,将指针存储在某个地方,最终在另一个例程中调用free。

第二个原因是C无法知道堆栈上是否有足够的空间用于分配。如果你的代码需要100%的健壮性,使用malloc会更安全,因为这样你的代码就可以知道分配失败并处理它。

票数 39
EN

Stack Overflow用户

发布于 2009-12-27 01:01:08

与类似hello world示例的静态声明相比,malloc是一个在运行时分配、重新分配和释放内存的绝佳工具,静态声明在编译时处理,因此大小不能改变。

因此,当您处理任意大小的数据时,例如读取文件内容或处理套接字,并且您不知道要处理的数据的长度时,Malloc总是很有用。

当然,在您给出的这个小例子中,malloc不是神奇的“正确工作的正确工具”,但对于更复杂的情况(例如,在运行时创建任意大小的数组),它是唯一可行的方法。

票数 17
EN

Stack Overflow用户

发布于 2009-12-27 01:00:14

代码语言:javascript
复制
char *some_memory = "Hello World";
sprintf(some_memory, "Goodbye...");

是非法的,则字符串文字为const

这将在堆栈上或全局(取决于声明它的位置)分配一个12字节的char数组。

代码语言:javascript
复制
char some_memory[] = "Hello World";

如果要为进一步的操作留出空间,可以指定数组的大小应该更大。(不过,请不要将1MB放在堆栈上。)

代码语言:javascript
复制
#define LINE_LEN 80

char some_memory[LINE_LEN] = "Hello World";
strcpy(some_memory, "Goodbye, sad world...");
printf("%s\n", some_memory);
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1963780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档