#include<stdio.h>
main()
{
int *num2=20;
printf("\n\n\n%d",num2);
}
当我按原样运行它时,它会打印20
. 如果我使用 *num2
它会导致分段错误。为什么?
#include<stdio.h>
main()
{
int *num2=20;
printf("\n\n\n%d",num2);
}
当我按原样运行它时,它会打印20
. 如果我使用 *num2
它会导致分段错误。为什么?
int *num2 = 20;
printf("%d", *num2);
定义一个指针并用 value 初始化它20
。初始化指针意味着分配一个它将指向它的地址,即当你这样做*num2
(取消引用num2
指针)时,你试图访问int
存储在 address 20
,这会导致未定义的行为~ 在这种情况下会变成 seg 错误。
试试这个:
int num = 20;
int *pNum = #
printf("%d", *pNum);
这定义了一个变量num
和指向pNum
变量的指针num
,当您取消引用时pNum
,您可以检索存储在num
.
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 */
&
一元运算符可帮助您获取操作数的地址。使用&
withvar
来获取它的地址,因为var
它是一个整数,所以将它存储在一个整数指针中。在你的情况下,num
.
int *num = &var; /* num is a pointer to var. Holds the address of var. */
二):
int *num = malloc(sizeof *num);
*num = 20;
int *num2=20;
它不是指向整数值的指针。这是一个无效的初始化。
这是一个指向int
其值为 的对象的指针20
:
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<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 的位置的地址。
当你写 "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);
}