1

次のコードでは、文字列を比較するコメント部分を削除すると、seg 11 エラーが発生します。理由がわかりません!コードの残りの部分は正常に動作しています。どんな助けでも大歓迎です!

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

int compare_scores_desc(const void* scorea, const void* scoreb){
int a = *(int*)scorea;
int b = *(int*)scoreb;
return a-b;
}

int compare_names(const void* namea, const void* nameb){
char** a = *(char**)namea;
char** b = *(char**)nameb;
return strcmp(*a,*b);
}

int main(int argc, char* argv[]){
int scores[7] = {456,234,65,563,67,19,100};
int i;
qsort(scores,7,sizeof(int),compare_scores_desc);
puts("\nThese are the scores in order : \n");
for(i=0;i<7;i++)
    printf("%i\n",scores[i]);
char *names[] = {"Krishna","Rama","Bhishma","Arjuna"};
/*qsort(names,4,sizeof(char*),compare_names);*/
puts("------------------");
puts("The names in order are : \n");
for(i=0;i<4;i++)
    printf("%s\n",names[i]);
return 0;
}
4

2 に答える 2

2

問題は文字列比較関数にあります。これを修正するための最小限の方法はおそらく次のとおりです。

int compare_names(const void* namea, const void* nameb){
char* a = *(char**)namea;
char* b = *(char**)nameb;
return strcmp(a,b);
}

nameaおよび引数は、文字列ベクトルへのnamebポインターです。あなたはこれを理解しているので、char **タイプを使用しました。

ただし、関数で行う必要があるのは、char *その配列からポインターを取得することだけです。これらのchar *ポインタはすでに文字列です。それらを再度逆参照する必要はありません。に渡すだけstrcmpです。

元のコードに診断が必要な制約違反があります。それはあなたにヒントを与えたはずです:

/* originally */
char** a = *(char**)namea; /* error: initialization from incompatible type */

char **を生成するa を逆参照してchar *いますが、それを再び a に格納して char **再度逆参照しているため、文字データがポインターとして誤って扱われています。

于 2013-08-15T00:16:58.020 に答える