char数组的最后一个值未知 - C.

时间:2017-03-01 16:56:43

标签: c arrays char overflow

我在C中创建一个简单的程序,它检查一些char数组的长度,如果它小于8,我想用零填充一个新数组并将它添加到前一个数组。这就是问题所在。我不知道为什么最后的值是某些迹象(见照片)。

char* hexadecimalno = decToHex(decimal,hexadecimal);
printf("Hexadecimal: %s\n", hexadecimalno);
char zeroes [8 - strlen(hexadecimalno)];
if(strlen(hexadecimalno) < 8){
    for(i = 0; i < (8-strlen(hexadecimalno)); i++){
        zeroes[i]='0';
    }
}
printf("zeroes: %s\n",zeroes);
strcat(zeroes,hexadecimalno);
printf("zeroes: %s\n",zeroes);

enter image description here

1 个答案:

答案 0 :(得分:1)

在C中,字符串(如您所知,字符数组)没有任何特殊元数据可以告诉您它们的长度。相反,惯例是字符串在char值为0的第一个字符处停止。这称为“空终止”。您的代码初始化zeroes的方式不会在数组末尾添加任何空字符。 (不要将您使用的'0'字符与NUL字符混淆 - 它们char值为48,而不是0。)

所有字符串操作函数都采用此约定,因此当您调用strcat时,它正在查找0字符以决定开始添加十六进制值的点。

C也不会自动为您分配内存。它假设您确切知道自己在做什么。因此,您的代码使用C99功能动态分配一个数组zeroes,该数组具有您需要附加'0'个字符的元素数量。你为终止NUL字符分配额外的字节,而strcat也会假设你为hexadecimalno的内容分配了空间,你有不。在C中,这不会触发边界检查错误。它只是在内存中写道,你不应该实际写下来。因此,您需要非常小心,分配足够的内存,并且只写入您实际分配的内存。

在这种情况下,您希望hexadecimalno始终为8位数字,左边用零填充。这意味着您需要一个具有8个char值的数组,以及一个用于NUL终结符的数组。因此,zeroes必须是char[9]

在为zeroes[i] = '0'设置正确的零数后,您需要将 next 元素设置为char0。你填零的事实会让事情变得混乱,但请记住,'0'0是两回事。

如果你分配了足够的空间(至少9个字符,假设hexadecimalno永远不会超过8个字符),那么当你将零填入其中以进行填充时,你将null终止数组,你应该得到预期的结果。