我正在尝试编写一个 C 代码来对字符串进行排序,但第 13 行总是显示一条错误消息



我正试图编写一个C代码来对字符串进行排序,但第13行总是显示一条错误消息。

#include <stdio.h>
#include <string.h>
void SortString(char *strings[], int size)
{
char temp[10];
for(int i =0; i < size -1; i++)
for(int j = i+1; j<size; j++)
{
if (strcmp(strings[i], strings[j])>0)
{
strcpy(temp, strings[i]);
strcpy(strings[i], strings[j]); //Error: Thread 1: EXC_BAD_ACCESS (code=2, address=0x100000fa6)
strcpy(strings[j], temp);
}
}    }
int main(){
char *names[] = {"D", "C", "B", "A"};
SortString(names, 4);    }

我知道我可以将*name[]更改为name[][20],将void SortString(char *strings[], int size)更改为void SortString(char strings[][20], int size)以使代码正确,但为什么*name[]是错误的?

我指的是这一页。

char *names[] = {"D", "C", "B", "A"};

当您像这样声明字符串时,它们将出现在只读内存中。您正试图在函数中修改内存的内容,这就是出现错误的原因。

实现此功能的最佳方法是为名称数组的每个成员分配内存,然后对其进行初始化

有很多方法可以做到这一点。我在下面举了一个例子。

char **names = malloc(MAX_ARRAY_SIZE * sizeof(char*));
if(NULL == names) {/**/}
names[0] = malloc(strlen("D")+1); //+1 for '' at the end.
if(NULL == names[0]) {/* Handle it*/}
strcpy(names[0], "D");

要排序的数据是指向字符串的char *指针数组。要重新排序数组,只需要交换指针。您不需要移动字符串内容。事实上,在这种情况下不能移动字符串内容,因为它们是字符串文字。当您尝试写入只读值时,会出现segfault。

我已经稍微重写了你的函数,只交换指针,现在它似乎可以工作了。

void SortString(char *strings[], int size)
{
char *temp;
for(int i = 0; i < size - 1; i++) {
for(int j = i + 1; j < size; j++) {
if (strcmp(strings[i], strings[j]) > 0) {
temp = strings[i];
strings[i] = strings[j];
strings[j] = temp;
}
}
}
}

Ideone.com 上的现场演示

相关内容

最新更新