取消引用指向类型为下一个值的指针时出错

时间:2014-03-02 10:59:17

标签: c pointers

此代码应该为我带来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();
}

4 个答案:

答案 0 :(得分:2)

pointer是指向i的不同地址位置,现在当您添加+1 sizeof(int)时,它会解决pointer的下一个位置,但不是第二个堆栈变量myInt

 pointer
+-------+               +------+
| 0x100 | -----> 0x100  |  5   |
+-------+               +------+
  0x300          0x104  |  7   |
                        +------+

一个简单的记忆可以如上所述,局部变量imyInt可以在堆栈中存储在连续的内存位置。但是,您pointer指向ipointer本身存储在地址位置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)。

即使在imyInt彼此相邻的情况下,在某些平台上i将具有较低的地址,而在其他平台上myInt将具有较低的地址。编译器具有足够的灵活性,如果您希望彼此相邻分配的变量,则需要明确说明。

答案 3 :(得分:0)

将“i”和“myInt”声明为静态,您将获得预期的行为。

注1:此类设计仅用于教学目的;
注意2:存储这些值以便使用指针访问的正确方法是使用向量。