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

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

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

为什么打印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来保存它的地址或仅为其分配内存来避免这种风险。 喜欢,

一世):

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

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

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

ⅱ):

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

定义一个指针并用值20初始化它。 要初始化指针意味着指定一个地址,它将指向它,即当你执行*num2 (取消引用num2指针)时,你试图访问存储在地址20 int ,这会导致未定义的行为 〜在这种情况下转为段故障。

试试这个:

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

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

  int *num2=20; 

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

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

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

要打印指针的值:

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

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

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

使用%p打印指针的值:

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

使用%p格式化字符串:

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

这不是正确的方法。 这就是你应该怎么做:

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

解引用int *num2=20;会出现seg错误int *num2=20; 像这样*num2 。 这个int *num2=20; 表示num2指向存储器位置20而不是指向保持整数20的位置的地址。

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

 #include int main() { int *num2; int value=20; num2=&value; printf("\n\n\n%d",*num2); }