使用Eclipse开发C应用程序时的内存映射

时间:2014-08-07 13:54:52

标签: c eclipse

出于教育目的,我编写的C代码超出了数组范围:

int main( int argc, char ** argv ) {

    char *cp = "dabsf";
    cp=cp+10;
    printf("%c",*cp);
    return 0;
}

我在输出中有n字母。

是否有可能以某种方式查看整个内存映射并查看cp数组附近的字节数并找到n的位置?

我正在使用MinGW编译器。

2 个答案:

答案 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

这也适用于调试,但不要在实际代码中执行此操作,访问不适合您的变量的内存地址是未定义的行为。