首页 新闻 会员 周边

关于数组赋值问题

0
悬赏园豆:15 [已解决问题] 解决于 2018-10-08 18:21

1 #include <stdio.h>
2 #include <string.h>
3
4
5 int main(void)
6 {
7 char hex[9] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef};
8 // char *str = malloc(sizeof(char));
9 char str[16];
10 char ch;
11 int i;
12
13 for (i =0; i < 8; ++i) {
14 ch = (hex[i] >> 4) & 0xf;
15 str[i * 2] = ch > 9 ? ch - 10 + 'a' : ch + '0';
16 ch = hex[i] & 0xf;
17 str[i * 2 + 1] = ch > 9 ? ch - 10 + 'a' : ch + '0';
18 }
19 printf("%s\n", str);
20 }
这是一个将十六进制数转化成字符串的代码,不知道为什么使用str[16]得到的结果和预想的不太一样,其结果是:1234567890abcdef4Vx«ί,这其中多出的部分是字符串形式的hex,如果动态分配str就不会有这样的问题,求大神帮忙解惑呀

insistYuan的主页 insistYuan | 初学一级 | 园豆:186
提问于:2018-09-30 15:38

求解惑!大神们!憋着很难受!!!

insistYuan 5年前
< >
分享
最佳答案
0

你如果明白c语言内存布局,这个问题就很容易理解了。
str 和 hex在栈中紧挨着存放。
str的16个字节都用到了,用于存放1234567890abcdef
而printf打印完1234567890abcdef没有遇到结束符就不会停止,会继续打印str后面的hex中的内容。
0x12是设备控制符号,并不会显示出来。
0x34是4 0x56是V 0x78是x 所以显示1234567890abcdef4Vx
如果动态分配str 此时str在堆中,而hex仍然在栈中。
此时str你分配了sizeof(char) 一个字节的内存,但由于malloc其实会分配较大的一块内存,所以你可以存放1234567890abcdef而不出错。
分配一个字节却使用16个字节是错误的做法。
你用了malloc,最后并没有free 如果free的话,应该会coredump.

收获园豆:15
GL0312 | 菜鸟二级 |园豆:270 | 2018-10-06 17:53

非常感谢您的回答,您后边所说的问题,我以后会注意的!

insistYuan | 园豆:186 (初学一级) | 2018-10-08 18:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册