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

not able to printf output of a function returning an array pointer in C

我正在尝试创建一个将十六进制字符串转换为十六进制字节数组的函数。示例: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;
}

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

还有几点建议:

  • 因为你也在main中使用string的长度,所以你只能在main中计算它并发送给函数。
  • 您使用了 'malloc',这也需要您调用 'free'。使用指针调用完成后 free(hex)
  • 迭代直到 len - 1,因为您在 for 循环主体中使用了前面的一个内存块。

tmp 仅够 space 存储您复制的两个字符。它 not 有 space 空字节终止字符串,实际上 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);
}