繁体   English   中英

我正在尝试编写C代码对String进行排序,但始终在第13行显示错误消息

[英]I'm trying to write a C code to sort String, but there always shows an error message in line 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"};

当您声明这样的字符串时,它们将出现在只读存储器中。 您正在尝试修改函数中内存的内容,这就是为什么您会收到错误消息。

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

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

char **names = malloc(MAX_ARRAY_SIZE * sizeof(char*));
if(NULL == names) {/**/}

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

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

我稍微重写了您的函数,使其仅交换指针,现在看来可以正常工作了。

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上进行现场演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM