2012-12-22 245 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

我以为它会将所有文本复制到一个新的数组中,谢谢解释! –

相关问题