出于教育目的,我编写的C代码超出了数组范围:
int main( int argc, char ** argv ) {
char *cp = "dabsf";
cp=cp+10;
printf("%c",*cp);
return 0;
}
我在输出中有n
字母。
是否有可能以某种方式查看整个内存映射并查看cp
数组附近的字节数并找到n
的位置?
我正在使用MinGW
编译器。
答案 0 :(得分:0)
从cp:
打印10个位置的存储器映射#include <stdio.h>
int main(void) {
int i;
char *cp = "dabsf";
printf("Address of 1st element of cp %p\n", cp);
for(i=1;i<=10;i++)
{
printf("Address of %c is %p\n",*(cp+i), cp+i); // cp+i is the same as &(*(cp+i))
}
return 0;
}
获取数组后面的任何元素的地址:
cp = cp + 8;
printf("Element at cp+8 is %c\n", *cp);
printf("Address of cp+8 is %p\n", cp);
注意:上面代码的输出可能会在连续运行代码时发生变化。
答案 1 :(得分:0)
这里有一些打印内存的代码,您可以使用它在任何指针后打印内存(尝试打印太多可能会导致访问冲突,特别是在第一个变量之前尝试地址):
#include <stdio.h>
void printMemory(void *address, int rows, int cols) {
for(int r = 0, c; r < rows; ++r) {
c = 0;
printf("%8p ", (void *)(((unsigned int*)address) + (r*cols + c)));
for(; c < cols; ++c) {
printf("0x%08x ", *(((unsigned int *)address) + (r*cols + c)));
}
printf("\n");
}
}
int main(void) {
char *test = "Hello World!";
unsigned int value1 = 0xABABABAB;
unsigned int value2 = 0xDEADBEEF;
unsigned int value3 = 0xCAFEBABE;
printf("%s, %d, %d, %d\n", test, value1, value2, value3);
printMemory(test, 4, 2);
printf("\n");
printMemory(&value1, 1, 3);
return 0;
}
输出是(在我的情况下,字符串存储在与整数不同的位置):
Hello World!, -1414812757, -559038737, -889275714
0x80486ad 0x6c6c6548 0x6f57206f
0x80486b5 0x21646c72 0x2c732500
0x80486bd 0x2c642520 0x2c642520
0x80486c5 0x0a642520 0x01000000
0xbf8aab50 0xabababab 0xcafebabe 0xdeadbeef
这也适用于调试,但不要在实际代码中执行此操作,访问不适合您的变量的内存地址是未定义的行为。