gpt4 book ai didi

c - 使用 gcc 上的指针将值存储在手动位置时出错

转载 作者:行者123 更新时间:2023-11-30 20:59:13 25 4
gpt4 key购买 nike

#include<stdio.h>

int main(void){

int a[3] = {1,2,3};
int *p;

p = &a+2;

// here p and &a+2 will going to be same...having some particular address on memory

*p = 56;

// m writing 56 on *(p) or *(&a+2)...

printf("%d %d\n",*p,*(&a+2));

return 0;
}

o/p 给我看是什么!! *p = 56*(&a+2) = 与 &a+2 相同...

对于p = &a+1,它给了我一个堆栈粉碎......

*(*(&a+2))上给我想要的结果56...

谁能向我解释一下这背后的确切原因是什么?

最佳答案

p = &a+2;

在功能上等同于

p = &(a[6]);

因为将 2 添加到 &a 会将 sizeof(a)*2 添加到 &a,并且 sizeof(a)*2 等于 sizeof(a[0])*3*2。取消引用结果指针会引发未定义的行为,因为它超出了数组的末尾。

<小时/>
#include <stdio.h>

int main(void) {
int a[3] = {1,2,3};
int *p = &a+2;
printf("a @ %p\n", (void*)a);
printf("a @ %p\n", (void*)&a);
printf("a[0] @ %p\n", (void*)&(a[0]));
printf("a[2] @ %p\n", (void*)&(a[2]));
printf("p = %p\n", (void*)p);
printf("a[6] @ %p\n", (void*)&(a[6]));
return 0;
}

给出

$ gcc -Wall -Wextra -pedantic --std=c99 a.c -o a && a
a.c: In function ‘main’:
a.c:5:14: warning: initialization from incompatible pointer type [enabled by default]
int *p = &a+2;
^
a @ 0x3878b9c3030
a @ 0x3878b9c3030
a[0] @ 0x3878b9c3030
a[2] @ 0x3878b9c3038
p = 0x3878b9c3048
a[6] @ 0x3878b9c3048

关于c - 使用 gcc 上的指针将值存储在手动位置时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47946027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com