此代码应该为我带来7的打印值。因为我已声明整数 i = 5 ,它在内存中分配4个字节,整数 < em> myInt ,它还在 int i 旁边分配 4个字节。然后我声明了一个指针来存储 int i 的位置/地址。但是当我向指针或i的位置添加1个整数时,意味着 i 的指针位置为4bytes,然后取消引用它。我没有得到我存储在myInt中的 7 而是得到了一些值243423(类似这样)
#include <stdio.h>
#include <stdlib.h>
void main()
{
int i=5;
int myInt=7;
int *pointer = &i;
printf("%i\n", *(pointer+1));
getch();
}
答案 0 :(得分:2)
pointer
是指向i
的不同地址位置,现在当您添加+1
sizeof(int)
时,它会解决pointer
的下一个位置,但不是第二个堆栈变量myInt
。
pointer
+-------+ +------+
| 0x100 | -----> 0x100 | 5 |
+-------+ +------+
0x300 0x104 | 7 |
+------+
一个简单的记忆可以如上所述,局部变量i
和myInt
可以在堆栈中存储在连续的内存位置。但是,您pointer
指向i
和pointer
本身存储在地址位置0x300
中。现在,当您取消引用pointer
的下一个内存位置时,它不指向myInt
而是指向其他一些未定义行为的内存位置。
答案 1 :(得分:1)
嗯,内存分配并不总是连续的。 *(指针+ 1)指向未初始化的内存。
答案 2 :(得分:0)
我可以看到你要去的地方,但是你会因误解而被绊倒。
如果你分配一个数组,那么数组的元素将彼此相邻,并且事情会按照你期望的方式运行:
int foo[] = { 4, 3, 2, 1 };
int* i = foo;
printf("%d\n", *i);
printf("%d\n", *(i + 1));
同样,如果你malloc
一块内存,然后将对象放在那个内存中,你可以按照你期望的方式使用指针算法。
但是,如果您几乎同时分配两个对象,则该语言不会承诺将它们放在内存中。除非告诉编译器“我想将这些对象彼此相邻分配”,否则没有理由使指针算法工作。您可以通过创建数组或分配内存块来实现。
允许编译器按照视频中的描述布局内存,但不是必需的。使用视频和原始问题中的变量,编译器可以注意到您从未对myInt
执行任何操作并对其进行优化。还允许注意到myInt
永远不会改变并输出可以在不同存储区域中分配的常量。它可能决定在堆栈上连续分配所有局部变量,但顺序与源代码中出现的顺序不同(可能这样做可以更好地使用RAM)。
即使在i
和myInt
彼此相邻的情况下,在某些平台上i
将具有较低的地址,而在其他平台上myInt
将具有较低的地址。编译器具有足够的灵活性,如果您希望彼此相邻分配的变量,则需要明确说明。
答案 3 :(得分:0)
将“i”和“myInt”声明为静态,您将获得预期的行为。
注1:此类设计仅用于教学目的;
注意2:存储这些值以便使用指针访问的正确方法是使用向量。