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