【发布时间】:2021-03-02 10:22:20
【问题描述】:
我试图了解动态内存分配,并希望有人能解释为什么以下代码会这样执行。
#include <stdlib.h>
#include <string.h>
char* create_string(void);
int main(){
char* str1 = NULL;
char* str2 = NULL;
str1 = create_string();
str2 = (char*)malloc(11);
str2 = create_string();
printf("String 1 is: %s", str1);
printf("String 2 is: %s", str2);
free(str1);
}
char* create_string()
{
char* stack_str = "TestString";
char* heap_str = (char*)malloc(strlen(stack_str) + 1);
strcpy(heap_str, stack_str);
if(heap_str == NULL)
{
printf("Oh no");
return NULL;
}
return heap_str;
}
据我所知,要在堆上分配内存,您必须使用具有分配内存块大小的 malloc,然后使用 strcpy() 或 memcpy() 之类的函数,就像我所做的那样上面的 str2(“TestString”的大小为 malloc 11,空终止符为 1。)
我只是很困惑为什么将 create_string 的结果分配给 str1,它是一个尚未分配内存块的空指针,会产生与 str2 相同的输出。
非常感谢!
【问题讨论】:
-
这两行
str2 = (char*)malloc(11); str2 = create_string();内存泄漏。当你将调用create_string()的结果分配给str2时,可见的malloc()分配的内存会丢失。
标签: c memory-management dynamic-memory-allocation