Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用gcc上的指针将值存储在手动位置时出错_C_Pointers - Fatal编程技术网

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

使用gcc上的指针将值存储在手动位置时出错,c,pointers,C,Pointers,o/p向我展示的是什么*p=56,但*&a+2=与&a+2相同 对于p=&a+1,它给了我一个堆栈粉碎 在**&a+2上给我期望的结果56 有人能给我解释一下这背后的确切原因吗?你的意思是p=a+2;,不是p=&a+2;。后者使用&a形成一个指向数组a的指针,然后尝试形成一个指向不存在的其他数组的指针,该数组如果存在,将是多维数组中的一行。指向数组的指针很少使用,这有助于人们混淆数组和指向它们的指针 在功能上等同于 p = &a+2; 因为向&a添加两个会将sizeofa*2添加到&a

o/p向我展示的是什么*p=56,但*&a+2=与&a+2相同

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

在**&a+2上给我期望的结果56

有人能给我解释一下这背后的确切原因吗?

你的意思是p=a+2;,不是p=&a+2;。后者使用&a形成一个指向数组a的指针,然后尝试形成一个指向不存在的其他数组的指针,该数组如果存在,将是多维数组中的一行。指向数组的指针很少使用,这有助于人们混淆数组和指向它们的指针

在功能上等同于

p = &a+2;
因为向&a添加两个会将sizeofa*2添加到&a,并且sizeofa*2等于sizeofa[0]*3*2。取消对结果指针的引用会引发未定义的行为,因为它超出了数组的末尾

谁能向我解释一下这背后的确切原因吗

原因是您正在调用未定义的行为,因此您的编译器和程序被允许做任何它想做的事情。这几乎就是未定义行为的定义:标准没有说明正确的操作是什么,因此程序可以做任何事情

仅仅因为**&a+2给出了正确的答案并不意味着&a+2是有效的代码。在很多情况下,未定义的行为会导致一个工作程序,但不能保证这样的程序会继续工作,甚至在进行进一步更改时继续编译


正如一些人已经指出的那样,未定义的行为来自p=&a+2,它将未初始化的地址分配给不兼容的指针。

不清楚您期望的是什么输出以及实际得到的是什么输出-请提供一个。请注意编译器警告:。这段代码调用了未定义的行为。*p我得到的是56,p是某个地址…所以我在这个地址上写了56,所以我应该得到56,因为*&a+2,但我得到的是地址而不是值。。。在printf声明中我得到了56个地址。。。而不是56,56始终打开警告!!!gcc-Wall-Wextra-pedantic-std=c99 a.c-o a&&ano!!p=a+2意味着&a[2]…意味着p=&a[2]…但我是关于&a+2…aannn..假设&a[0]=100,然后我通过在p上存储124来在124上写56。所以我应该为*&a+2得到56@RuchiM,Mewada-不清楚你想要实现什么。但是&a+2并不表示任何合法的地方。我想你的意思是将sizeofa*2添加到&a@Max,谢谢,修正了。学究式的——它们只是最松散的意义上的等价物——它们是不同类型的。@Oliver Charlesworth,下面的警告已经涵盖了这一点。改为功能等效。@Antti Haapala,你是说&a+2是UB吗?为什么?
p = &a+2;
p = &(a[6]);
#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;
}