为什么free()在c中的字符串指针上添加weired字符



我是C语言的新手,还不到两个月大,但我遇到了malloc、realloc和free的问题。我写了一个代码在stdout上打印数字,我的方法是,先把它转换成字符串,然后再打印;(计数用于记录打印的字符。(

int print_num(int num, int count)
{
int i = 0, len;
char last, *ptr2, *ptr = (char *)malloc(sizeof(char));
if (num == 0)
return (print_char('0', count));
if (num < 0)
count = print_char('-', count);
num = abs(num);
while (num != 0)
{
last = (num % 10) + '0';
if (i == 0)
*(ptr) = last;
else
{
ptr2 = (char *)realloc(ptr, i + 1);
*(ptr2 + i) = last;
ptr = ptr2;
}
num /= 10;
i++;
}
len = strlen(ptr);
for (i = len; i > 0; i--)
count = print_char(ptr[i - 1], count);
free(ptr);
return (count);
}

问题是,在没有free(ptr)free(ptr2)的情况下,代码运行良好。当我在另一个函数中多次调用该函数时,我会在字符串指针ptr的末尾得到weired char。在一行中打印两个数字的示例

print_num(39, 0)
print_num(39, 0)

我得到

Length:[39, U�39]

当我删除free(ptr)时,代码运行良好,但它们将是内存泄漏。我该怎么做?

int print_char(char c, int count)
{
write(1, &c, 1);
return (count + 1);
}

您在非字符串的字节数组上使用strlen

C中的字符串是以null结尾的字符序列。在ptr指向的内存中构建一个字符数组,但不添加终止的空字节。这本身不是问题,但随后您对其调用strlen,它需要一个以null结尾的字符串。这会导致函数读取超过已分配内存的末尾,从而触发未定义的行为。

您已经在i中存储了数组的长度,因此不需要调用strlen。就用它吧。

len = i;

最新更新