C 打印指向整数的指针会导致分段错误。为什么? #包括 main() { int*num2=20; printf(“\n\n\n%d”,num2); }

C 打印指向整数的指针会导致分段错误。为什么? #包括 main() { int*num2=20; printf(“\n\n\n%d”,num2); },c,pointers,segmentation-fault,printf,dereference,C,Pointers,Segmentation Fault,Printf,Dereference,当我按原样运行它时,它会打印20。如果我使用*num2会导致分段错误。为什么?正如其他人指出的,您的代码中有一个bug。您将整数与指向整数的指针混淆,您可能打算执行以下操作: #include<stdio.h> main() { int *num2=20; printf("\n\n\n%d",num2); } 使用%p打印指针的值: int num2 = 20; int* pnum2 = &num2; 使用%p格式化字符串: printf("\n\n\n%

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

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

#include<stdio.h>
main()
{
    int *num2=20;
    printf("\n\n\n%d",num2);
}
使用
%p
打印指针的值:

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

使用
%p
格式化字符串:

printf("\n\n\n%p",pnum2);
定义指针并使用值
20
对其进行初始化。初始化指针意味着分配一个它将指向它的地址,即当您执行
*num2
(解除对
num2
指针的引用)时,您试图访问存储在地址
20
中的
int
,这会导致未定义的行为~在这种情况下会变成seg故障

请尝试以下方法:

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

这定义了一个变量
num
和指向变量
num
的指针
pNum
,当您取消引用
pNum
时,您可以检索存储在
num
中的值,这不是正确的方法。你应该这样做:

int num = 20;
int *pNum = &num;
printf("%d", *pNum);
int var = 20;    /* var is a integer object holding the value 20 */
#包括
int main()
{
int num1=20;
int*num2=&num1;
printf(“地址=%p处的Number1=%d”,*num2,num2);
}
在解引用
int*num2=20时,将出现seg故障
像这样
*num2
。这个
int*num2=20
表示
num2
指向内存位置20,而不是保存整数20的位置的地址

#include<stdio.h>
int main()
{
    int num1=20;
    int * num2 = &num1;
    printf("Number1=%d At Address=%p",*num2,num2);
}
它不是指向整数值的指针。这是一个无效的初始化

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

 int *num2=20;
要打印指针的值,请执行以下操作:

int *p = &(int) {20};
int *num = malloc(sizeof *num);
*num = 20; 
为什么打印
num
是正常的,但
*num
会导致分段错误? 当你说,
int*num2=20。相当于

printf("%p\n", (void *) p);
您正在将
int
分配给
int*
。你应该收到一封信

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).*/
num
指向地址“
20
”。你不知道那是不是一个有效的地址

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


解决方案:
num
应包含有效地址。不要冒险自己分配一些随机地址

通过创建类型为
int
的对象并分配
num
来保存该对象的地址,或者只为其分配内存,可以避免这种风险。像

i):

warning: initialization makes pointer from integer without a cast[enabled by defaut]
int *num = &var; /* num is a pointer to var. Holds the address of var. */
&
一元运算符帮助您获取操作数的地址。使用
&
var
获取其地址,由于
var
是一个整数,因此将其存储在整数指针中。在您的情况下,
num

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

warning: initialization makes pointer from integer without a cast[enabled by defaut]
int *num = &var; /* num is a pointer to var. Holds the address of var. */
当您写入“printf(“%d”,*num);”时,您试图获取存储在地址20处的值(十六进制的0x00000014)。地址20处的值不可访问或可能是垃圾邮件。这就导致了分割错误。现在看这段代码,这将通过取消引用指针产生所需的结果20:

int *p = &(int) {20};
int *num = malloc(sizeof *num);
*num = 20; 
#包括
int main()
{
int*num2;
整数值=20;
num2=&value;
printf(“\n\n\n%d”,*num2);
}

%p
而不是
%d
。如果没有警告(例如使用
gcc-Wall-g yourcode.c-o yourprog
),您的代码将无法编译,您应该注意它们。你的代码中有一个巨大的错误(你不能将20分配给指针
num2
portable)。花几个小时阅读一本关于C编程(和指针!)的好书。当我这样打印时,它会打印20。如果我使用*num2,它会打印分段错误。为什么?因为地址20上什么都没有。当我这样打印时,它会打印20。如果我使用*num2,它会打印分段错误。为什么?那是因为无法保证地址20是否可供您使用。看我编辑过的答案。哦,天哪,我错编辑了你的帖子而不是我的。。。对不起,没问题,现在答案更好了;)你能还原我的更改吗?我看不到更改的历史记录,因此无法正确还原它。。。很抱歉。