将字符串数组传递给函数分段错误

Passing an array of strings to a function-segmentation fault

所以,我在下面编写了这段代码,它应该将一个字符串数组传递给一个函数,然后该函数将数组按字母顺序排序。我知道我完成它的方式可能并不漂亮,但它是用于学校的,我需要将它传递给一个函数并使用 strcmp。我 运行 遇到了一些问题,但我设法解决了所有编译错误。但是,现在,当我尝试 运行 程序时,出现错误 segmentation fault(core dumped)。有人可以指导我犯错的地方吗?

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

void sort(char *str[]);

int main()
{
    char *states[11] = {"Florida", "Oregon", "California", "Georgia"};

    sort(states);

    return 0;
}   

void sort(char *str[])
{
    int x, y;
    char alpha[11] = {0};

  for(x = 1; x < 4; x++){
    for(y = 1; y < 4; y++){
      if(strcmp(str[y - 1], str[y]) > 0){
        strcpy(alpha, str[y - 1]);
        strcpy(str[y - 1], str[y]);
        strcpy(str[y], alpha);
      }
    }
  }

  printf("\nThe states, in order, are: ");
  for(x = 0; x < 4; x++)
    printf("\n%s", str[x]);
} 

您不能覆盖 strcpy() 会做的字符串文字,修改字符串文字会调用未定义的行为,而不是交换指针。

这个

strcpy(alpha, str[y - 1]);
strcpy(str[y - 1], str[y]);
strcpy(str[y], alpha);

会像

一样工作得很好
alpha = str[y - 1];
str[y - 1] = str[y];
str[y] = alpha;

如果您将 alpha 声明为

char *alpha;

另外,请注意字符串的大小不是 11 in

char *states[11];

这是数组可以容纳的指针数。指针指向字符串文字,在这种情况下其大小并不重要。重要的是数组包含指针,你可以让指针指向其他地方,但是你不能像字符串文字占用的那样改变静态内存。

添加到 iharob 的答案中,如果所有字符串的长度都处于 11 状态,则您的代码应该可以正常工作。您的代码在尝试将 "Oregon" 与 "California" 交换时崩溃。由于 "California" 的长度是 11 个字节, "Oregon" 的长度是 7 个字节(包括空字符),当您使用 strcpy 将字符串数组 "Oregon" 覆盖为 "California"您的缓冲区溢出,程序将使用信号 11 进行核心转储。您可以使用 iharob 建议的方法,也可以更改代码,如下所示:-

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

void sort(char str[][11]);

int main()
{
    char states[4][11] = {"Florida", "Oregon", "California", "Georgia"};

    sort(states);

    return 0;
}   

void sort(char str[][11])
{
    int x, y;
    char alpha[11] = {0};

  for(x = 1; x < 4; x++){
    for(y = 1; y < 4; y++){
      if(strcmp(str[y - 1], str[y]) > 0){
        strcpy(alpha, str[y - 1]);
        strcpy(str[y - 1], str[y]);
        strcpy(str[y], alpha);
      }
    }
  }

  printf("\nThe states, in order, are: ");
  for(x = 0; x < 4; x++)
    printf("\n%s", str[x]);
} 

产生的输出将是:-

gaurav@ubuntu:~$ ./a.out 

The states, in order, are: 
California
Florida
Georgia
Oregon