首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >程序没有输出(预期有3行),没有编译或运行时错误。

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

Stack Overflow用户
提问于 2014-02-02 20:43:29
回答 1查看 78关注 0票数 0

该程序可在这里获得:http://ideone.com/P1c15J

下面简要介绍一下它所做的工作:

声明一个字符串ptr。将此指针地址转换为一个小端点地址,并将这些字节存储在char[] adr中。把这个打印出来。

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

如果去掉最后两行(级联和打印不良代码),该程序实际上可以工作。有预期产出。

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

编辑:我知道我期望的输出将被混淆,因为adr中包含的字节不映射到字符。现在这对我来说没什么问题。我对获取字符串中的地址字节很感兴趣。

代码语言:javascript
运行
复制
#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;
}
EN

回答 1

Stack Overflow用户

发布于 2014-02-02 21:22:31

试图打印未终止的字符串adr

代码语言:javascript
运行
复制
snprintf(badcode, sizeof badcode, "%s%s", ptr, adr);

按照@adr的建议,在printf()之前添加

代码语言:javascript
运行
复制
adr[sizeof(void*)]=0;

或(假设相当大(空*)为4)

代码语言:javascript
运行
复制
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'\x78junk之类的内容。因为最后一个字节不知道是'\0',所以UB结果。使用snprintf(..., "%s", adr)时,adr需要终止'\0'

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21515975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档