繁体   English   中英

无法 function 的 printf output 返回 Z0D61F8370D1412F80B4 中的数组指针

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

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

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

结果, strtol function 读取到数组的末尾,触发未定义的行为

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

此外,您只是在初始化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);
}

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

还有几点建议:

  • 由于您也在 main 中使用字符串的长度,您只能在 main 中计算它并将其发送到 function。
  • 你使用了一个'malloc',它要求你也调用'free'。 使用指针调用free(hex)完成后
  • 迭代直到len - 1因为您在 for 循环的主体中使用了一个 memory 块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM