[英]Getting garbage while dereferencing a char value with int type pointer
[英]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 |
+------+
一个简单的存储器可以如上,局部变量i
和myInt
都可以在堆栈中的连续存储器位置中存储。 但是您使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)。
即使在i
和myInt
彼此myInt
下,在某些平台上, i
的地址也会较低,而在其他平台上, myInt
地址会较低。 编译器具有足够的灵活性,如果您希望变量彼此相邻分配,则需要明确说明。
将“ i”和“ myInt”声明为静态,您将获得预期的行为。
注1:这种设计仅用于教学目的。
注2:为了使用指针进行访问,存储这些值的正确方法是使用向量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.