為什麼我的 C 數組會記住之前函數調用的舊數據?

用戶2643729

當我運行以下 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);
}
巴馬克·謝米拉尼

這是未定義的行為。如果只設置了前 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

為什麼我的數據庫中會出現空數組?

為什麼我的 javascript reduce 函數被跳過了?

為什麼我的函數返回 0.0?(C 代碼)

為什麼 VS 為我的析構函數標記 C26432?

為什麼我不能在 tkinter 綁定中調用函數?

為什麼我的 C 結構在輸入中沒有得到任何數據?

為什麼在調用函數時會出現 Invalid hook 調用?

為什麼此參數包中的函數調用會向後求值?

為什麼我在 C 中的 main 函數只打印第一個 for 循環?

為什麼我的函數 encodeChar 不起作用?

誰能告訴我為什麼這個函數在調用時會拋出錯誤

為什麼當我用 stl 向量替換數組時,我的代碼會變慢,在 C++ 中,數組是否比向量更快?

誰能告訴我為什麼在嘗試調用此函數時會出錯?

為什麼這些比較在 C 中在數學上相同時會給我不同的答案?

為什麼 Redux Saga yield 調用返回一個函數,而不是數據?

為什麼我的函數在 componentDidMount 之前運行

我的 C 函數反轉數組在連續運行後用隨機數填充第一個和最後一個索引。為什麼是這樣?

為什麼我的數據在異步函數 nodejs 打字稿中更新之前返回狀態

為什麼調用 useState 鉤子的 set 函數會立即應用於異步函數?

為什麼我的代碼調用一個函數兩次?

NodeJS 為什麼不在我的 IF/Else 語句中調用我的函數

為什麼我應該更喜歡單獨的函數而不是 C++ 中的函數式編程的靜態方法?

為什麼當我嘗試重新分配()結構的指針數組時,我的 C 程序會崩潰?

為什麼我的 C 函數不打印任何東西?

為什麼 pow 函數會減少 C 中循環的長度

為什麼 Oracle 轉換函數將帶重音的“e”轉換為“c”?

為什麼我們需要在從 C 中的函數分配返回值之前聲明變量數據類型?

為什麼調用GET方法時數據庫會循環?

為什麼此多播 Deligation 不適用於 C# 中的函數?