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

时间:2016-07-31 16:03:31

标签: c pointers malloc

在下面的示例中,在分配值时解除引用并不会显示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

1 个答案:

答案 0 :(得分:4)

在第一个示例中,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未初始化且可能包含陷阱表示。