【发布时间】:2021-11-19 04:35:36
【问题描述】:
当我运行以下 C 代码时,我得到了值:
- 222222222
- 312222222
- 102222222
我期待这些值:
- 222222222
- 31
- 10
为什么我的 intToStr 函数中定义的 char number[] 会记住以前的值?我认为一旦函数调用结束,所有本地数据或多或少都会被破坏。
#include <stdio.h>
void intToStr(int n);
int main(void)
{
intToStr(222222222);
intToStr(31);
intToStr(10);
return 0;
}
void intToStr(int n)
{
char number[10];
int l = 0;
if (n < 0)
{
l++;
number[0] = '-';
n *= -1;
}
int nCopy = n;
while (nCopy > 9)
{
nCopy /= 10;
l++;
}
int r;
while (n > 9)
{
r = n % 10;
n /= 10;
number[l--] = r + '0';
}
number[l] = n + '0';
printf("%s\n", number);
}
【问题讨论】:
-
在 C 中,字符串必须以值
0的字符结尾。你没有这样做。所以printf一直运行,直到在你不打算打印的随机内存中找到一个零。 -
"或多或少被破坏" 不,因为你不是 null 终止字符串,你会打印超出你想要的,行为不是由任何标准定义的。您需要为
number分配更多字节。对于 10 位数字,您需要 11 个字节,否则您会遇到更多未定义的行为。 -
我在数组的最后一个位置使用 '\0' 字符重新运行了代码,但仍然得到相同的结果。为什么当函数结束时数组仍然会记住以前的数据?
-
可能是因为
number的存储在堆栈上,因为它是函数的局部变量,如果没有执行其他任何操作,并且您从同一个函数再次调用该函数,那么您' 可能在同一位置的堆栈上具有与以前相同的字节。关键是您没有初始化number的字节,并且没有(最初)以空值终止您的字符串。 -
@Wyck 是的,我相信你是对的。我刚刚尝试再次运行它,但这次在函数调用之间插入随机代码,现在数组中填充了随机数据。