打印整数指针会导致分段错误。为什么?

时间:2013-10-17 10:26:36

标签: c pointers segmentation-fault printf dereference

#include<stdio.h>
main()
{
    int *num2=20;
    printf("\n\n\n%d",num2);
}

当我按原样运行时,会打印20。如果我使用*num2,则会导致分段错误。为什么呢?

7 个答案:

答案 0 :(得分:4)

int *num2 = 20;
printf("%d", *num2);

定义指针并使用值20对其进行初始化。要初始化指针意味着指定一个地址,它将指向它,即当你执行*num2(取消引用num2指针)时,你试图访问存储在地址{{{}的int 1}},导致未定义的行为〜在这种情况下会变成seg错误。

请改为尝试:

20

这定义了一个指向变量int num = 20; int *pNum = &num; printf("%d", *pNum); 的变量num和指针pNum,当您取消引用num时,您可以检索存储在{{1}中的值}}

答案 1 :(得分:3)

为什么打印num没问题,但*num导致细分错误?

当你说int *num2=20;时。它相当于

int *num; /* Type:(int*) num is a pointer to an integer and hence holds address of an integer object. */
num = 20; /* Type of the value assigned to num is (int).*/

您要将int分配给int *。你本应该收到

warning: initialization makes pointer from integer without a cast[enabled by defaut]

num指向地址“20”。您甚至不知道这是有效地址

因此,当您打印num时,您没有任何问题。但是解除引用,地址(20)是无效的内存读取,导致未定义的行为并导致分段错误


解决方案:

num应保留有效地址。不要通过自己分配一些随机地址来冒这个风险。

通过创建int类型的对象并指定num来保存它的地址或仅为其分配内存来避免这种风险。像,

<强> I):

int var = 20;    /* var is a integer object holding the value 20 */

&一元运算符可帮助您获取操作数的地址。使用&var获取其地址,并且var是一个整数,将其存储在整数指针中。在您的情况下,num

int *num = &var; /* num is a pointer to var. Holds the address of var. */

<强> II):

int *num = malloc(sizeof *num);
*num = 20; 

答案 2 :(得分:2)

 int *num2=20;

它不是指向整数值的指针。这是一个无效的初始化。

这是指向int对象的指针,其值为20

int *p = &(int) {20};

打印指针的值:

printf("%p\n", (void *) p);

答案 3 :(得分:1)

正如其他人指出您的代码中存在错误。你将整数与指向整数的指针混淆了你可能想要做这样的事情:

int num2 = 20;
int* pnum2 = &num2;

使用%p打印指针值:

printf("\n\n\n%p",pnum2);

答案 4 :(得分:0)

使用%p格式化字符串:

printf("\n\n\n%p",num2);

答案 5 :(得分:0)

这不是正确的做法。这就是你应该如何去做的事情:

#include<stdio.h>
int main()
{
    int num1=20;
    int * num2 = &num1;
    printf("Number1=%d At Address=%p",*num2,num2);
}

如果int *num2=20;取消引用*num2,您将遇到段错误。这个int *num2=20;的含义是num2指向内存位置20而不是包含整数20的位置的地址。

答案 6 :(得分:0)

当你写“printf(”%d“,* num);”您正在尝试获取存储在地址20(十六进制的0x00000014)中的值。地址20处的值无法访问或可能是垃圾。因此它会导致分段错误。现在看到这段代码,这将通过解引用指针产生所需的结果:

x = 1; % Change to whatever number you want
F = A(E < x,:)