#include<stdio.h>
main()
{
int *num2=20;
printf("\n\n\n%d",num2);
}
当我按原样运行时,会打印20
。如果我使用*num2
,则会导致分段错误。为什么呢?
答案 0 :(得分:4)
int *num2 = 20;
printf("%d", *num2);
定义指针并使用值20
对其进行初始化。要初始化指针意味着指定一个地址,它将指向它,即当你执行*num2
(取消引用num2
指针)时,你试图访问存储在地址{{{}的int
1}},导致未定义的行为〜在这种情况下会变成seg错误。
请改为尝试:
20
这定义了一个指向变量int num = 20;
int *pNum = #
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,:)