簡體   English   中英

分配了 strcat char* 的分段錯誤

[英]Segmentation Fault with strcat char* allocated

memory 的分配對於 C 的新用戶來說有點復雜,我已經閱讀了關於這個主題的其他答案,但我還沒有完全理解它們,所以我再次問一些可能是多余的東西。

我的問題是在行中收到Segmentation fault,思路是把十進制數轉換成二進制,結果是字符串的形式,也就是例如27 = "11011",我用char數組來我想以char的形式將模運算數%2的結果串聯起來。

我也很感激有關如何解決這些類型的問題的信息,這些問題最近對我來說很常見。

int main()
{
    char *numero_bin = malloc(256 * sizeof(int));
    long numero = 1;

    char auxiliar;

    memset(numero_bin, 0, sizeof numero_bin);
    numero_bin[0] = '\0';
    while (numero != 0)
    {
        scanf("%d", &numero);
        if (numero == 0)
            break;

        for (int i = 0; numero > 0; i++)
        {
            //numero_bin[i] = (char)numero % 2;
            auxiliar = numero % 2;
            strcat(numero_bin, auxiliar);
            numero = numero / 2;
        }
        numero = 1;
    }
    return 0;
}

您將 char 傳遞給strcat它需要char *手冊頁strcat

   strcat(numero_bin, auxiliar); 

auxiliar更改為&auxiliar並改用strncat


第二個問題是為auxiliar分配無效值,這里是

auxiliar = numero % 2;

這只是將 integer 0 或 1 分配給你真正需要的是'0''1'將其更改為

auxiliar = numero % 2 + '0';

現在到長篇故事..

從手冊中,它說 strcat 附加copy of null-terminated string

char * strcat(char *restrict s1, const char *restrict s2);

strcat() 和 strncat() 函數 append 將一個以空字符結尾的字符串 s2 復制到以空字符結尾的字符串 s1 的末尾,然后添加一個結尾的 `\0'。 字符串 s1 必須有足夠的空間來保存結果。

現在調用 function

strcat(numero_bin, &auxiliar); 

這里的auxiliar被定義為一個字符,並且這個&auxiliar指向 memory 任何它被定義的地方

auxiliar  +------+ - - - +- 
          |.     |       | <- we do not know what is here; may be null may not be
          +------+ - - - +-
           0x01    0x02
      &auxiliar

現在,當執行上面的 function 時,strcat 會嘗試復制和連接..它會繼續從位置&auxiliar&auxiliar + 1開始獲取字符,依此類推,直到遇到'\0'

因為我們沒有指定長度,這將導致一種叫做未定義行為的東西。

我們如何解決這個問題.. 我們可以使用 strncat 並說只復制一個字符而不是發送&auxiliarstrcat

strncat(numero_bin, &auxiliar, 1);

或者我們仍然可以使用strcat做這樣的事情

for (int i = 0; numero > 0; i++)
{
    auxiliar = (numero % 2) + '0';
    char b[2] ;
         b[0] = auxiliar;
         b[1] = '\0'; // b is '\0' terminated for sure
    strcat(numero_bin, b);
    numero = numero / 2;
}

更多信息來自手冊

安全考慮 strcat() function 很容易被濫用,使惡意用戶能夠通過緩沖區溢出攻擊任意更改正在運行的程序的功能。 (參見 FSA。)

避免使用 strcat()。 相反,使用 strncat() 或 strlcat() 並確保沒有更多的字符被復制到目標緩沖區,而不是它可以容納的。

請注意, strncat() 也可能有問題。 完全截斷字符串可能是一個安全問題。 由於截斷的字符串不會像原始字符串那樣長,它可能指的是完全不同的資源,使用截斷的資源可能會導致非常不正確的行為。

strcat() 將 2 個字符串(基本上是 2 個字符 arrays 以 null 終止)作為 arguments 並將第二個字符串附加到第一個字符串。

您已將變量 auxiliar 聲明為 char。 C 中的單個字符不是字符串。 因此,將字符作為參數傳遞,該參數需要一個字符串(以空字符結尾的字符數組)將產生錯誤。 要解決此問題,您必須將 char(&auxiliar) 的地址作為第二個參數傳遞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM