簡體   English   中英

在C中實現反向功能時出現分段錯誤

[英]Segmentation fault while implementing reverse function in C

我決定在C語言中制作一個reverse(s)函數,在此過程中,我在編譯過程中遇到了2條警告消息。

alexander@debian:~/Dropbox/GitRepo/M2MPL/text$ make reverse
cc     reverse.c   -o reverse
reverse.c: In function 'reverse':
reverse.c:29:2: warning: return makes integer from pointer without a cast [enabled by default]
reverse.c:29:2: warning: function returns address of local variable [enabled by default]
alexander@debian:~/Dropbox/GitRepo/M2MPL/text$ 

由於它們是警告,因此當我使用scanf("%s", str1);輸入字符數組Dropbox時,我試圖忽略它們並運行程序scanf("%s", str1); 結果顯示為Segmentation Fault

alexander@debian:~/Dropbox/GitRepo/M2MPL/text$ ./reverse
Enter a string to reverse: Dropbox
Segmentation fault
alexander@debian:~/Dropbox/GitRepo/M2MPL/text$ 

這是我對reverse(s)函數的實現:

/* reverse: returns a reversed string of s */
char reverse(char s[])
{
    int i, len=strlen(s);
    char result[LIMIT];

    for (i = len; i >= 0; --i) {
            result[len-i] = s[i];
    }

        return result;
}

完整代碼在這里!

我需要幫助來了解為什么我得到了Segmentation fault而不是xobporD Segmentation fault ,如果可能的話,還提出了解決此問題的建議。

首先:
編譯器不會僅僅出於娛樂目的而警告您。 如果您忽略編譯器警告,則程序不會崩潰,您不會感到驚訝。

您將指針返回到在函數末尾超出范圍的自動變量。 返回給調用方的指針無效,因為它指向reverse函數返回后不再存在的對象。

另一個問題是,您復制的第一個字符為'\\0'因此您得到的字符串為空。 您需要反轉字符串的字符,但仍將'\\0'放在字符串的末尾。

第一個警告意味着由reverse函數簽名指示的返回類型與您實際返回的變量的類型不匹配。 預期的類型為char ,並且您將返回一個char * (因為result會衰減到這樣的指針)。 因此,編譯器將指針轉換為整數( char ),這通常不是程序員想要的。

第二個問題是您正在返回局部變量的地址,並且由於自動存儲的工作方式,該變量在函數返回后不再可用。 如果要返回指向某些數據的指針,則必須全局分配(在函數內部聲明為static或全局聲明),或者必須動態分配。

問題代碼中存在一些缺陷。

  • 返回類型可能應該是'char *'而不是'char'。
  • 嘗試將本地堆棧內存返回給調用方。
  • 結果字符串可能缺少字符串終止字符。

以下代碼修復了上述問題。 它將分配的“堆”內存中的字符串返回給調用方。 (當不再需要內存時,調用者應釋放()內存。):

/* reverse: returns a reversed string of s */
char *reverse(char *s)
   {
   int i, len=strlen(s);
   char *result = malloc(len+1);
   if(result)
      {
      result[len] = '\0';
      for(i = len; i >= 0; --i)
         result[len-i] = s[i];
      }

   return(result);
   }

暫無
暫無

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

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