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

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

4

7 回答 7

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

定义一个指针并用 value 初始化它20。初始化指针意味着分配一个它将指向它的地址,即当你这样做*num2(取消引用num2指针)时,你试图访问int存储在 address 20,这会导致未定义的行为~ 在这种情况下会变成 seg 错误。

试试这个:

int num = 20;
int *pNum = &num;
printf("%d", *pNum);

这定义了一个变量num和指向pNum变量的指针num,当您取消引用时pNum,您可以检索存储在num.

于 2013-10-17T10:28:15.693 回答
4

为什么打印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).*/

您分配intint *. 你应该收到一个

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

num指向地址' 20'。即使那是一个有效的地址,你也不知道。

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


解决方案:

num应该持有一个有效的地址。不要冒险自己分配一些随机地址。

通过创建一个类型的对象int并分配num来保存它的地址或为此分配内存来避免这种风险。喜欢,

一世):

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

&一元运算符可帮助您获取操作数的地址。使用&withvar来获取它的地址,因为var它是一个整数,所以将它存储在一个整数指针中。在你的情况下,num.

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

二):

int *num = malloc(sizeof *num);
*num = 20; 
于 2013-10-17T13:38:47.740 回答
2
 int *num2=20;

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

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

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

要打印指针的值:

printf("%p\n", (void *) p);
于 2013-10-17T10:29:19.963 回答
1

正如其他人指出的那样,您的代码中有错误。您将整数与指向整数的指针混淆了您可能打算执行以下操作:

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

用于%p打印指针的值:

printf("\n\n\n%p",pnum2);
于 2013-10-17T10:27:32.800 回答
0

使用%p格式化字符串:

printf("\n\n\n%p",num2);
于 2013-10-17T10:27:36.937 回答
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 的位置的地址。

于 2013-10-17T10:29:06.287 回答
0

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

#include<stdio.h>
int main()
{
int *num2;
int value=20;
num2=&value;
printf("\n\n\n%d",*num2);
}
于 2017-01-31T07:38:52.803 回答