SIGSEGV在C函数中

问题描述:

我的函数有问题。SIGSEGV在C函数中

当函数获取这样的参数,一切正常

char text[50] = "Liquorice gummies macaroon";

但是当我送这个,我得到SIGEGV

char *text = "Liquorice gummies macaroon"; 

我的功能:

char *sort(char *text) { 

    int length = strlen(text); 
    char *sortString = text; 

    if (length >1){ 
     shell_sort(sortString, length); 
     return sortString; 
    } else if(length == 1) { 
     return text; 
    } 
} 

在函数排序中,我调用shell_sort

void shell_sort(char *text, int size) { 

    int gap, temp, i , j; 

    for (gap = size/2; gap > 0; gap /= 2) { 

     for (i = gap; i<size; i++) { 
      temp = text[i]; 

      for (j = i; j >= gap ;j-=gap) { 
       if (temp < text[j-gap]) { 
        text[j] = text[j-gap]; 
       } else { 
        break; 
       } 
      } 
      text[j] = temp; 
     } 
    } 
} 

但是当我送这个,我得到SIGEGV

字符*文字= “甘草软糖马卡龙”;

那是因为你的函数shell_sort()修改传递给它的参数,修改字符串文字是undefined behaviour。这就是为什么它会导致段错误(顺便说一句,segfault并不能保证C标准)。

当函数获得这样的参数,一切正常

字符文本[50] = “甘草橡皮糖蛋白杏仁”;

当从一个字符串初始化char数组文本,字符串文字是复制到阵列,它可以修改。所以它按照你的预期工作。

+0

感谢您的回答。请问是否有一个简单的解决方案来修复这个错误? – Bando

+0

您已经知道解决方案。如果你想修改它,使用一个数组('char text [50]')。 –