【发布时间】:2018-10-02 11:04:33
【问题描述】:
在使用malloc() 分配内存空间之后,我很好奇指针到底是什么?手册页告诉我calloc() 将分配的内存空间初始化为零。
malloc() 函数分配 size 字节并返回一个指向已分配内存的指针。 内存未初始化。如果 size 为 0,则 malloc() 返回 NULL,或稍后可以成功传递给 free() 的唯一指针值。
和
calloc() 函数为每个大小字节的 nmemb 元素数组分配内存 并返回一个指向分配内存的指针。 内存设置为零。如果 nmemb 或 size 为 0,然后 calloc() 返回 NULL 或稍后可以返回的唯一指针值 成功传递给free()。
我为自己创建了一个非常简短的 C 示例程序,用于 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() 的工作原理,它适合这里。
【问题讨论】:
-
当你像这样测试它时,往往会意外地为 0。当您在实际程序中执行此操作时,这不会很好地重复,并且先前释放的堆块正在被回收。您不得做出任何假设。
-
如果内存以零开头,
printf将其视为""(零是终止符)如果要查看实际值,则应使用另一种方法。 -
scanf("%d", &amount);→scanf("%u", &amount); -
我认为您问题的“编辑 1”部分的答案可能是特定于实现/操作系统的,但是由于 calloc 需要连续内存并且 malloc 可以使用片段,因此 malloc 可能可以使用已分配的内存对于您的程序,而 calloc 需要保留“新”内存。或者 malloc 可以将实际预留推迟到内存实际使用的时候。
-
注意:为什么使用类型
unsigned amount;?查看malloc()接受的参数类型。
标签: c initialization malloc dynamic-memory-allocation