Jul*_*ian 5 c malloc initialization dynamic-memory-allocation
在malloc()用于分配内存空间之后,我很好奇指针究竟是什么?该联机帮助页告诉我calloc()初始化已分配的内存空间为零.
malloc()函数分配大小字节并返回指向已分配内存的指针. 内存未初始化.如果size为0,则malloc()返回NULL或一个以后可以成功传递给free()的唯一指针值.
和
calloc()函数为每个大小为字节的nmemb元素数组分配内存,并返回指向已分配内存的指针. 内存设置为零.如果nmemb或size为0,则calloc()返回NULL或一个以后可以成功传递给free()的唯一指针值.
我在C中为C(haha)创建了一个非常简短的示例程序:
int main() {
char *dynamic_chars;
unsigned amount;
printf("how much bytes you want to allocate?\n");
scanf("%d", &amount);
dynamic_chars = (char*)malloc(amount*sizeof(char));
printf("allocated:\n%s\n", dynamic_chars);
free(dynamic_chars);
return 0;
Run Code Online (Sandbox Code Playgroud)
}
但是,在执行此代码时,它只输出任何内容.如果我初始化内存,例如0xFFFF使用循环初始化每个字节,那么程序会向我显示我期望的内容.内存空间实际存在,因为我不会收到错误声称我正在尝试访问未初始化的变量.
由于内存空间通常不会被删除但被标记为可重写,我想知道如果通过执行我的程序,我是否应该能够看到以前使用的随机内存字节?但我什么都看不到,所以我真的很困惑malloc().
关于
Sou*_*osh
12
不, 引用 在这种情况下, 引用 该 也就是说,请参阅此讨论,了解为什么不投出malloc()或者可能是内存使用的另一件事,关于我的程序是有趣的:如果我使用calloc(),分配内存,我可以通过例如监视来跟踪我的程序的实际内存使用情况.例如,如果我告诉我的程序,每次分配1.000.000.000字节的内存calloc()我将在我的系统监视器中看到以下内容:
malloc()返回未初始化的内存,其内容是不确定的.因此,尝试使用该值调用未定义的行为.C11,附件§J.2,未定义的行为
malloc使用函数分配的对象的值%s需要一个以null结尾的char数组.但是,内容dynamic_chars是不确定的,因此很可能根本没有空终止符,这将导致超出范围的内存访问,而后者又调用UB.C11,章节§7.22.3.5,malloc功能(强调我的):
malloc函数为大小由其指定size且
其值不确定的对象分配空间.malloc()和家人的回报价值C..