程序没有输出(预期3行),没有编译或运行时错误

时间:2014-02-02 20:43:30

标签: c concatenation

该计划可在此处获取:http://ideone.com/P1c15J

以下是它的作用:

声明字符串ptr。将此指针地址转换为little-endian地址,并将这些字节存储在char[] adr中。打印出来。

然后将字符串ptradr连接到badcode,打印badcode

如果你取出最后两行(连接和打印坏码),程序实际上是有效的。有预期的产出。

由于某种原因,当我尝试连接并打印出字符串时,没有编译错误,没有运行时错误但也没有输出。

编辑:我知道我期望的输出会出现乱码,因为adr中包含的字节不会映射到ASCII字符。这对我来说不是问题。我很有兴趣在字符串中获取地址字节。

#include <stdio.h>
#include <stdint.h>
#include <string.h>

int main(void) {
    size_t i;

    char badcode[500];

    char const *ptr = "This string's little endian memory address is: ";

    char adr[sizeof(void *) + 1];
    uintptr_t ptrAddress = (uintptr_t)ptr;

    printf("Pointer address is %p\n", ptr);
    printf("Converting to 0x");
    for(i = 0; i < sizeof(void *); ++i)
    {
        adr[i] = ptrAddress & 0xff;
        printf("%2.2X", (unsigned int)(unsigned char)adr[i]);
        ptrAddress >>= 8;
    }
    printf("\n");

    snprintf(badcode, sizeof badcode, "%s%s", ptr, adr);

    printf("\n%s", badcode);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

尝试使用

打印未终止的字符串adr
snprintf(badcode, sizeof badcode, "%s%s", ptr, adr);

根据@adr的建议,在printf()

之前添加
adr[sizeof(void*)]=0;

OR(假设sizeof(void *)为4)

snprintf(badcode, sizeof badcode, "%s%hh02X%hh02X%hh02X%hh02X", 
    ptr, adr[0], adr[1], adr[2], adr[3]);

OP期望adr[4]包含类似“\ x12 \ x34 \ x56 \ x78”的内容,但a[5]包含的内容类似于'\x12''\x34,{{ 1}},'\x56'\x78。由于不知道最后一个字节是junk,因此会产生UB。使用'\0'时,snprintf(..., "%s", adr)需要adr终止。