在下面的示例中,在分配值时解除引用并不会显示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;
}
#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;
}
答案 0 :(得分:4)
在第一个示例中,p
未初始化。用*p
取消引用其值会调用未定义的行为。
在第二个示例中,p
被分配了由malloc()
返回的指针。 p
为NULL
并且取消引用它会调用未定义的行为,或者p
保存一个有效的地址,用于足够大的内存块以存储int
并为任何类型正确对齐。因此,定义p
取消引用以存储a
的值,第二个printf
将打印10
。
两种情况下的第一个printf
打印内容未定义。地址&p
不是格式%d
的正确类型,行为未定义。
您可以通过将此代码更改为printf("%p\n", (void*)&p);
来修复此代码,但会打印本地变量p
的地址。
您可能打算编写printf("%p\n", (void*)p);
来打印p
中包含的实际地址,但这也会在第一种情况下调用未定义的行为,因为p
未初始化且可能包含陷阱表示。