2012-12-22 187 views
0

因此,我的兄弟正在製作一個程序,將字符串中的所有單詞轉換爲標籤,但由於某種原因,它總是在執行結束時出現「分段錯誤」錯誤。我試圖找到可能導致它的原因,但沒有找到。下面的代碼:爲什麼這個程序給我一個「分段錯誤」?

#include <stdio.h> 
#include <string.h> 

char* setHashtag(char text[10000]) 
{ 
    int i, j; 

    printf("Initial text = %s\n", text); 

    for (i = 9998; i >= 0; i--) 
    { 
     text[i+1] = text[i]; 
    } 
    text[0] = ' '; 

    for (i = 0; text[i+1] != '\0'; i++) 
    { 
     if(text[i] == ' ' && text[i+1] != ' ') 
     { 
      for (j = 9998; j > i; j--) 
      { 
       text[j+1] = text[j]; 
      } 
      text[i+1] = '#'; 

      printf("Partial text = %s\n", text); 
     } 
    } 

    return text; 
} 

void execute() { 
    char text[5000], textFinal[10000]; 

    gets(text); 

    strcpy(textFinal, setHashtag(text)); 
    printf("%s\n", textFinal); 
} 

int main() 
{ 
    execute(); 
    printf("Back to main\n"); 
    return 0; 
} 

回答

8

您通過大小5000的數組到您的功能,但您可以訪問內部10000元素。當然,它會崩潰。

在函數聲明中指定的數組大小並不重要。它被編譯器忽略。這

char* setHashtag(char text[10000]) 

相當於該

char* setHashtag(char *text) 

即函數接收指向你原來的參數數組的開始,參數數組的不是一個新的本地副本(在C裸數組不是可複製)。

這意味着,當你打電話給你的功能

char text[5000]; 
... 
setHashtag(text) 

text陣列不會奇蹟般地成爲char [10000]陣列。它仍然是一個char [5000]數組,因爲它最初被聲明。試圖訪問text[9998]等功能導致未定義的行爲。

由於您setHashtag功能預計大小10000的固定大小的數組,這可能是一個更好的主意來聲明功能

char* setHashtag(char (*text)[10000]) 

,並在數組參數傳遞的setHashing(&text)。這將確保您無法傳入錯誤大小的數組。在函數內部,您必須以(*text)[i]的形式訪問數組。

+0

我以爲它會將所有文本複製到一個新的數組中,謝謝解釋! –

相關問題