该程序位于此处:http://ideone.com/P1c15J
简要介绍一下它的作用:
声明字符串ptr
。将该指针地址转换为小端地址,并将这些字节存储在char[] adr
中。打印出来。
然后将字符串ptr
和adr
连接到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;
}
最佳答案
尝试使用以下命令打印未终止的字符串adr
snprintf(badcode, sizeof badcode, "%s%s", ptr, adr);
按照@adr的建议,在
printf()
之前添加adr[sizeof(void*)]=0;
或(假设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
,'\x56
,'\x78
,junk
之类的内容。由于未知最后一个字节为'\0'
,因此会产生UB。使用snprintf(..., "%s", adr)
时,adr
必须终止。