繁体   English   中英

取消引用指针以键入下一个值时出错

[英]error while dereferencing pointer to type to the next value

该代码应该给我带来了7的打印值。因为我声明了整数i = 5 ,它在内存中分配了4个字节,而整数myInt也在int i旁边分配了4个字节 然后,我声明了一个指针来存储int i的位置/地址。 但是,当我加1点的整数指针或我的位置,这意味着4字节到的指针位置,然后取消对它的引用。 我没有获得存储在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();
}

pointer是指向i的不同地址位置,现在当您将+1 sizeof(int)+1时,它将寻址pointer下一个位置,而不是第二个堆栈变量myInt

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

一个简单的存储器可以如上,局部变量imyInt都可以在堆栈中的连续存储器位置中存储。 但是您使pointer指向i并且pointer本身存储在地址位置0x300 现在,当取消引用pointer下一个内存位置时,该位置不指向myInt而是指向其他未定义行为的内存位置。

嗯,内存分配并不总是连续的。 *(pointer + 1)指向未初始化的内存。

我可以看到您要去的地方,但是您被误会绊倒了。

如果分配一个数组,则该数组的元素彼此相邻放置,事情将按照您期望的方式工作:

int foo[] = { 4, 3, 2, 1 };
int* i = foo;
printf("%d\n", *i);
printf("%d\n", *(i + 1));

同样,如果您malloc了一块内存,然后在该内存中将对象彼此相邻放置,则可以按期望的方式使用指针算术。

但是,如果您大约同时分配两个对象,则该语言不会保证在内存中将它们彼此相邻放置。 除非您告诉编译器“我要彼此相邻分配这些对象”,否则没有理由使指针算法起作用。 您可以通过创建一个数组或分配一个内存块来实现。


如视频中所述,允许编译器布置内存,但并非必须如此。 使用视频中的变量和原始问题,允许编译器注意到您永远不会对myInt进行任何myInt并对其进行优化。 还可以注意到myInt永不更改,并输出可以在不同内存区域中分配的常量。 它可能决定在堆栈上连续分配所有局部变量,但是顺序与源代码中出现的顺序不同(也许这样做可以更好地使用RAM)。

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

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

注1:这种设计仅用于教学目的。
注2:为了使用指针进行访问,存储这些值的正确方法是使用向量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM