gpt4 book ai didi

c - `malloc()`刚刚分配的内存内容是什么?

转载 作者:太空狗 更新时间:2023-10-29 14:50:39 25 4
gpt4 key购买 nike

我很好奇在使用malloc()分配内存空间后,指针究竟持有什么?联机帮助页告诉我 calloc() 将分配的内存空间初始化为零。

The malloc() function allocates size bytes and returns a pointer to the allocated memory. The memory is not initialized. If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be successfully passed to free().

The calloc() function allocates memory for an array of nmemb elements of size bytes each and returns a pointer to the allocated memory. The memory is set to zero. If nmemb or size is 0, then calloc() returns either NULL, or a unique pointer value that can later be successfully passed to 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 字节的内存,我将在系统监视器中看到以下内容: Memory consumption when using <code>calloc()</code>

正如您可能想象的那样,在使用 malloc() 时,我什么也看不到。我明白,只是通过分配内存,我当时并没有真正使用它,但我仍然对为什么我的操作系统(unix derivate)不会识别它被使用感到困惑。由于 malloc() 就像 calloc() 将物理地址返回到我没有得到的内存位置,这个内存区域似乎并没有被操作系统保留.否则我可以在系统监视器中看到它吗?如果我宁愿将此作为一个新问题发布,请告诉我。但我认为,既然问题仍然是关于 malloc() 是如何工作的,那么它就适合放在这里。

最佳答案

不,malloc() 返回未初始化的内存,其内容是不确定的。因此,尝试使用 值调用 undefined behavior .

引用 C11,附件 §J.2,未定义的行为

The value of the object allocated by the malloc function is used

在这种情况下,%s 需要一个以 null 结尾的 char 数组。然而,dynamic_chars 的内容是不确定的,因此很可能根本没有空终止符,这将导致越界内存访问,进而调用 UB。

引用 C11,章节 §7.22.3.5,malloc 函数(强调我的):

The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate.

也就是说,please see this discussion on why not to cast the return value of malloc() and family in C. .

关于c - `malloc()`刚刚分配的内存内容是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37184733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com