[英]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 仍然是垃圾,因为它是从堆栈分配的。
还有几点建议:
free(hex)
完成后len - 1
因为您在 for 循环的主体中使用了一个 memory 块。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.