2016-07-31 20 views
-1

在下面的例子中,在赋值时取消引用不会显示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

+0

请帮助我真的很困惑在指针 – harry

+0

请格式化代码引导与4个空格的行。还要非常小心地正确格式化代码,以便易于遵循。我在编辑中对此进行了通过,但是您可以仔细检查一下,看看我是否错过了任何内容。 – jaydel

+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是未初始化的并且可以包含一个陷阱表示。

+0

关于如何打印指针值:http://stackoverflow.com/documentation/c/3750/formatted-input-output/12982/printing-the-value-of-a-pointer-to-an-object#t= 201607311741210873583 – alk

+0

@harry:如果此答案有用,您可以通过单击答案分数下方的灰色复选标记来接受该答案。 – chqrlie

相关问题