當我運行以下 C 代碼時,我得到了值:
我期待的價值觀:
為什麼我的 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);
}
這是未定義的行為。如果只設置了前 3 個字符,則可能會打印312222222
或可能會打印312???????????????????
中的最後一個字符char number[10]
未初始化,這意味著編譯器可能會決定不理會它而保留舊值,或者發生其他事情。
否則printf
不知道字符串在哪裡結束,它會一直打印直到它隨機命中零。
如果緩衝區溢出,則會printf
在內存中找到一組不同的字符(我們不應該訪問這些字符),並且程序會繼續打印這些相同的字符,直到它隨機命中零並最終停止。
要修復它,只需確保'\0'
最後有。您還可以添加額外的檢查以確保長度不超過緩衝區大小
工作示例:
char number[10];
int l = 0;
if (n < 0)
{
l++;
number[0] = '-';
n *= -1;
}
if (n < 0) return;
int nCopy = n;
while (nCopy > 9)
{
nCopy /= 10;
l++;
}
int len = l;
if (len + 1 > sizeof(number))
return;
number[len + 1] = '\0';
int r;
while (n > 9)
{
r = n % 10;
n /= 10;
number[l--] = r + '0';
}
number[l] = n + '0';
printf("%s\n", number);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句