无法在 C 中打印返回数组指针的函数的输出

Posted

技术标签:

【中文标题】无法在 C 中打印返回数组指针的函数的输出【英文标题】:not able to printf output of a function returning an array pointer in C 【发布时间】:2022-01-15 20:44:21 【问题描述】:

我正在尝试创建一个将十六进制字符串转换为十六进制字节数组的函数。示例:str = "1c01" -> hex_bytes = 0x1c, 0x01

当我尝试打印十六进制值时,我得到的都是 0。我认为这与我的指针有关,但我不确定。任何帮助将不胜感激。

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

const char *input_1 = "1c0111001f010100061a024b53535009181c";

unsigned int *str_to_hexbytes(const char *hex_str) 
    size_t len = strlen(hex_str);
    unsigned int *hex = malloc(sizeof(unsigned int)* len / 2);
    for(int i, j = 0; i < len; i += 2, j++) 
        char tmp[2];
        strncpy(tmp, hex_str + i, 2);
        hex[j] = strtol(tmp, NULL, 16);
    
    return hex;


int main(void) 
    size_t len = strlen(input_1) / 2;
    unsigned int *hex = str_to_hexbytes(input_1);
    for (int i = 0; i < len; i++) 
        printf("%x ", hex[i]);
    
    return 0;

【问题讨论】:

如果我没记错的话,你可以删除c++标签,因为你的代码是纯C的。 "I'm thinking it's something to do with my pointers but I am not sure." -- 您是否尝试过在调试器中逐行运行代码,同时监视所有变量的值,以确定您的程序在哪一点停止按预期运行?如果您没有尝试过,那么您可能想阅读以下内容:What is a debugger and how can it help me diagnose problems? 您可能还想阅读以下内容:How to debug small programs?。 【参考方案1】:

tmp 仅具有足够的空间来存储您复制的两个字符。它确实 没有 有空间用于终止字符串的空字节,实际上strncpy 不会写入那个空字节,因为它在读取的两个字符中没有找到一个。

因此,strtol 函数读取到数组的末尾,触发 undefined behavior。

使tmp 3 个字符长并手动添加空字节。

另外,您只是在初始化 j,而不是 i,所以请确保您也这样做。

for(int i = 0, j = 0; i < len; i += 2, j++)  
    char tmp[3];
    strncpy(tmp, hex_str+i, 2);
    tmp[2]=0;
    hex[j] = strtol(tmp, NULL, 16);

【讨论】:

【参考方案2】:

你没有用 0 初始化 i。这可能是你的问题。 int i, j = 0; 仅将 j 的值更改为零,i 仍然是垃圾,因为它是从堆栈分配的。

还有一些建议:

由于你也在main中使用了字符串的长度,你只能在main中计算并发送给函数。 您使用了“malloc”,它也要求您调用“free”。使用指针调用free(hex) 完成后 迭代直到 len - 1,因为您在 for 循环体中使用了前面的一个内存块。

【讨论】:

"which requires you to call 'free' also" -- 我不同意“需要”这个词。像“通常推荐”这样的表述可能更合适。 What REALLY happens when you don't free after malloc? 我同意,选词不好,英语是我的第二语言。

以上是关于无法在 C 中打印返回数组指针的函数的输出的主要内容,如果未能解决你的问题,请参考以下文章

C语言打印输出指针数组

C 语言二级指针作为输入 ( 指针数组 | 将 二级指针 作为函数输入 | 抽象函数业务逻辑 )

C语言函数如何return数组?

C 语言二级指针作为输入 ( 二维数组 | 抽象业务函数 | 二维数组打印函数 | 二维数组排序函数 )

C ++从函数返回指向数组的指针的正确方法

C语言 如何给指针数组划分动态存储空间