指针上的引用和整数初始化之间的差异

时间:2013-04-28 04:24:22

标签: c pointers

使用此代码:

int a = 10;
int *ap = 4;

printf("%d", ap);

使用4?

初始化int指针ap时发生了什么

为什么

printf("%d", ap);

工作,但

printf("%d", *ap);

抛出错误?

2 个答案:

答案 0 :(得分:4)

那是因为4不是有效的内存地址(在您的环境中)。如果您尝试取消引用具有无效内存地址的指针,则会出现错误。您应该使用适当的内存地址初始化它

int a = 4;
int *ap = &a;

printf("%d", *ap);

int *ap = malloc(sizeof(int));
*ap = 4;

printf("%d", *ap);
free(ap);

答案 1 :(得分:0)

int a = 10a设置为(int)10,即普通的旧整数10. int *ap = 4ap设置为(int*)4,即内存地址 0x00000004。这是一个相对安全的假设,当您尝试使用*ap时,您的流程无权访问地址4,因此会出现细分错误(或者他们现在称之为的任何问题)。

顺便说一下:为了便于携带,请使用%pprintf指针。 (不保证sizeof(int*) == sizeof(int),这可能会导致一个微妙的打印错误。)