gpt4 book ai didi

c - 为什么解引用与 malloc 的行为不同?

转载 作者:行者123 更新时间:2023-11-30 18:29:23 26 4
gpt4 key购买 nike

在下面的示例中,赋值时取消引用并不会显示 malloc 的任何错误,这是怎么回事?

#include <stdio.h>
#include <stdlib.h>

int main() {
int *p;
printf("%d", &p);
int a = 10;
*p = a;
printf("%d", *p);
free(p);
return 0;
}

without malloc

#include <stdio.h>
#include <stdlib.h>

int main() {
int *p = (int*)malloc(sizeof(int));
printf("%d", &p);
int a = 10;
*p = a;
printf("%d", *p);
free(p);
return 0;
}

with malloc

最佳答案

在第一个示例中,p 未初始化。使用 *p 取消引用其值会调用未定义的行为。

在第二个示例中,p 被分配了一个由 malloc() 返回的指针。要么 pNULL 并且取消引用它会调用未定义的行为,要么 p 保存足够大的内存块的有效地址以存储 int 并针对任何类型正确对齐。因此定义了取消引用 p 来存储 a 的值,第二个 printf 将打印 10

第一个 printf 在这两种情况下打印的内容都是未定义的。地址 &p 不是格式 %d 的正确类型,行为未定义。

您可以通过将其更改为 printf("%p\n", (void*)&p); 来修复此代码,但它会打印局部变量 p 的地址。

您可能打算编写 printf("%p\n", (void*)p); ,它将打印 p 中包含的实际地址,但这也会在第一种情况下调用未定义的行为,因为 p 未初始化并且可能包含陷阱表示。

关于c - 为什么解引用与 malloc 的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38685855/

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