C 为什么指针值被修改为1?

C 为什么指针值被修改为1?,c,pointers,C,Pointers,我很好奇为什么在这段代码中,当程序运行时,*ptr+1的值变为1而不是6 #include <stdio.h> int main (void) { int *ptr, content = 3; ptr = &content; *(ptr + 1) = 6; *(ptr + 2) = 10; *(ptr + 3) = 14; int i = 0; for (i = 0; i < 4; ++i

我很好奇为什么在这段代码中,当程序运行时,*ptr+1的值变为1而不是6

#include <stdio.h>

int main (void)
 {
     int *ptr, content = 3;

     ptr = &content;

     *(ptr + 1) = 6;
     *(ptr + 2) = 10;
     *(ptr + 3) = 14;

     int i = 0;

     for (i = 0; i < 4; ++i)
      {
          printf("The address is %p and the content is %d \n", ptr+i, *(ptr+i));
      }

     return 0;
 }
以下是程序的输出:

The address is 0x7fff7b400a88 and the content is 3 
The address is 0x7fff7b400a8c and the content is 1 
The address is 0x7fff7b400a90 and the content is 10 
The address is 0x7fff7b400a94 and the content is 14 
我在valgrind中运行了它,没有出现任何错误或任何东西,也尝试过用谷歌搜索它,可能我搜索了错误的东西,但没有找到结果。

您正在修改未分配给您的内存,因此这是未定义的行为

可能发生的情况是,变量i被分配到该位置,因为它是函数中堆栈空间的下一次使用。在这一点上我是1。所以输出是1

改变

int content = 3;
ptr = &content;

感谢@KeithThompson修复指针分配

如果您只是在尝试指针算法。这将起作用,因为现在您拥有10整数数组中的整个堆栈空间,您正在修改未分配给您的内存,因此这是未定义的行为

可能发生的情况是,变量i被分配到该位置,因为它是函数中堆栈空间的下一次使用。在这一点上我是1。所以输出是1

改变

int content = 3;
ptr = &content;

感谢@KeithThompson修复指针分配


如果您只是在尝试指针算法。这将起作用,因为现在您拥有10整数数组中的整个堆栈空间。程序通过恶意指针修改内存。最有可能的是,指针指向恰好存储i的位置,因此它在该点输出i的值


修复错误,神秘感就会消失。理解有缺陷的程序比理解正确的程序要复杂得多。

该程序通过恶意指针修改内存。最有可能的是,指针指向恰好存储i的位置,因此它在该点输出i的值


修复错误,神秘感就会消失。理解有缺陷的程序比理解正确的程序要复杂得多。

看起来您是在为i。我不知道为什么这对你很重要,因为你不应该写你没有明确分配的数据。

看起来你是在写为i。不知道为什么它对你很重要,因为你不应该写你没有明确分配的数据。

你将ptr移动到指向你没有分配的内存,并得到编译器放在那里的任何东西。

你将ptr移动到指向你没有分配的内存,并获取编译器放在那里的任何内容。

您的代码正在写入未作为数组一部分分配的地址,因此正在调用未定义的行为。任何事情都可能发生,这是正确的


最有可能发生的情况是变量i存储在0x7FFF7B400A8C,并且正在修改打印内容。

您的代码正在写入未作为数组一部分分配的地址,因此正在调用未定义的行为。任何事情都可能发生,这是正确的

*(ptr + 1) = 6;
*(ptr + 2) = 10;
*(ptr + 3) = 14;
最有可能发生的情况是变量i存储在0x7FFF7B400A8C,并且正在修改打印内容

*(ptr + 1) = 6;
*(ptr + 2) = 10;
*(ptr + 3) = 14;
堆栈损坏发生在上述状态中,这是一种未定义的行为。由于您的程序只有权访问*ptr+0,幸运的是没有发生崩溃

而*ptr+1打印1的原因是,它指向堆栈中声明的下一个变量。这意味着它指向i。在for循环之前尝试打印*ptr+1,它将打印0。并尝试打印i的地址,它将与ptr+1相同

int后i=0;在for循环之前,声明另外两个变量,如下所示,然后运行,在打印*ptr+2和*ptr*3时,也不会得到10和14

堆栈损坏发生在上述状态中,这是一种未定义的行为。由于您的程序只有权访问*ptr+0,幸运的是没有发生崩溃

而*ptr+1打印1的原因是,它指向堆栈中声明的下一个变量。这意味着它指向i。在for循环之前尝试打印*ptr+1,它将打印0。并尝试打印i的地址,它将与ptr+1相同

int后i=0;在for循环之前,声明另外两个变量,如下所示,然后运行,在打印*ptr+2和*ptr*3时,也不会得到10和14


好的,非常感谢您的回答,我还没有得到内存分配方面的信息,只是想玩转指针的概念。@StorKatten我相信您要做的是使用数组,请检查我的edit.int content[4]={3};就足够了,但您需要更改ptr=&content;到ptr=&content[0];。好的,非常感谢您的回答,我还没有得到内存分配方面的信息,只是想玩转指针的概念。@StorKatten我相信您要做的是使用数组,请检查我的edit.int content[4]={3};沃 uld已足够-但您希望更改ptr=&content;到ptr=&content[0];。
int i = 0;
int x = 2;
int y = 2;

printf("%d", *(ptr + 1)); //this will print 0

for (i = 0; i < 4; ++i)
{
....
}
...
int *ptr = NULL;
int content[] = {3, 0, 0, 0};
ptr = content;
...