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 = #
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是否可供您使用。看我编辑过的答案。哦,天哪,我错编辑了你的帖子而不是我的。。。对不起,没问题,现在答案更好了;)你能还原我的更改吗?我看不到更改的历史记录,因此无法正确还原它。。。很抱歉。