malloc()
分配内存空间后指针具体保存了什么。手册告诉我calloc()
会用零初始化已分配的内存空间。
malloc()
函数分配大小为size字节的内存,并返回指向已分配内存的指针。内存未被初始化。如果size为0,则malloc()
返回NULL或可稍后成功传递给free()的唯一指针值。
以及
calloc()
函数为大小为nmemb个元素,每个元素大小为size字节的数组分配内存,并返回指向已分配内存的指针。内存设置为零。如果nmemb或size为0,则calloc()
返回NULL或可稍后成功传递给free()的唯一指针值。
我为自己编写了一个非常简短的C程序示例:
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;
然而,当执行此代码时,它什么都没有输出。如果我自己初始化内存,例如使用循环将每个字节都初始化为 0xFFFF
,那么程序会显示我期望的结果。内存空间实际上存在,因为我不会收到错误,声称我正在尝试访问未初始化的变量等。
由于内存空间通常不会被删除,而是标记为可重写的,我想知道通过执行我的程序,我是否应该能够看到以前使用过的随机字节的内存?但我什么也看不到,所以我对malloc()
的工作方式非常困惑。
编辑1
关于malloc()
或者可能是内存使用的一般性问题,对于我的程序来说很有趣:
如果我使用calloc()
来分配内存,我可以通过监视它来跟踪我的程序的实际内存使用情况。例如,如果我告诉我的程序,每个calloc()
要分配1,000,000,000字节的内存,我将在我的系统监视器中看到以下内容:
你可能可以想象,使用malloc()
时,我什么也看不到。我理解,仅通过分配内存,我并没有真正使用它,但我仍然对为什么我的操作系统(Unix衍生版)不会将其识别为已使用而感到困惑。由于malloc()
和calloc()
一样,返回物理地址到内存位置,我不明白为什么这个内存区域似乎实际上并未被操作系统保留。否则,我应该能在系统监视器中看到它,对吧?
如果我应该将此作为新问题发布,请告诉我。但我认为,由于问题仍然是关于malloc()
的工作原理,因此它适合在这里。
printf
将其视为""
(零是终止字符)。如果您想查看实际值,则应使用另一种方法。 - Gwenscanf("%d", &amount);
→scanf("%u", &amount);
- Spikatrixunsigned amount;
?请查看malloc()
接受的参数类型。 - chux - Reinstate Monica