定义指向内存地址和打印内容C ++的指针

时间:2014-06-23 13:35:07

标签: c pointers

我想打印出来自给定内存地址的内容。

使用这段代码,我可以定义一个变量,定义一个指向它的指针并使用指针打印它的内容。

char buf[100];
void *p = buf;

strcpy(p, "Test string");

printf("Address: %X\n", &buf);
printf("Contents: %c\n", p);

我想要做的是指定一个特定的内存地址,并打印出该块的内容。我尝试通过递增和递减p进行实验,但它不打印任何东西。

6 个答案:

答案 0 :(得分:4)

一个有趣的小问题。每个程序员迟早都应该出现这种情况,无论是出于好奇还是出于好意。

基本上是四个部分。

  1. 以适当大小的整数表示您想要的地址。
  2. 将整数转换为指向某种类型的指针。
  3. 取消引用指针以获取该类型的值。
  4. 打印值。
  5. [如果需要,增加地址并重复。]
  6. 为简单起见,我将使用地址0x1000和整数内容。

    int address = 0x1000;
    int* pcontent = (int*)address;
    int content = *pcontent;
    printf ("Address %p: content %08x\n", pcontent, content);
    

    应该提出两点。

    1. 这是未定义的行为,但如果您想获得结果则不可避免。
    2. 我选择的地址可能是有效的内存,也可能触发陷阱错误,或者它可以执行任何操作。您将不得不尝试使用不同的地址来找出哪些地址。
    3. [许多年前,我使用这种策略在只有96KB内存的机器上打印出内存的全部内容,这导致了一些有趣的黑客攻击可能性。但我离题了。]

答案 1 :(得分:3)

您使用了错误的说明符来打印地址。使用%p并将参数投射到void *

printf("Address: %p\n", (void*)buf);  

并打印字符串

printf("Contents: %s\n", p);

答案 2 :(得分:1)

您必须将指针p定义为

char *p = buf;

或使用铸造然后递增p。例如

p = ( char *)p + n;

例如

printf( "%s\n", ( char *)p + 5 );

您可能不会递增/递减void *类型的指针,因为void的类型不完整。

这些调用中的格式说明符

printf("Address: %X\n", &buf);
printf("Contents: %c\n", p);

错了。

如果要打印出字符串,则必须指定%s。如果你想只打印一个字符,那么你应该写

char *p = buf;
printf("Contents: %c\n", p[0]);

void *p = buf;
printf("Contents: %c\n", ( ( char *)p )[0]);

答案 3 :(得分:0)

您正在使用%c 而是使用%s 打印字符串printf("Contents: %s\n", p);

答案 4 :(得分:0)

如果我们想从内存中打印随机字节,我们希望使用:

char *p = buf;

printf("Address:  %p\n", p);
printf("Contents: 0x%02x\n", *p);

但是请注意,给定一个随机地址,解除引用会导致应用程序失败。您不能假设所有内存空间都有效。

答案 5 :(得分:0)

您可以尝试这样的事情:

void printMemory(void* mem, int bytes){
    char* p = (char*) mem;
    for(int i=0;i<bytes;i++){
        printf("%x ",p[i] & 0xff);
        if(i%8 == 7)
            printf("\n");
    }
}

这将每行打印8个字节。