4

次のコードがあります。

int main(){
    char **array;
    char a[5];
    int n = 5;

    array = malloc(n *sizeof *array);

    /*Some code to assign array values*/

    test(a, array);

    return 0;
}

int test(char s1, char **s2){
    if(strcmp(s1, s2[0]) != 0)
        return 1;

    return 0;
}

char および char ポインター配列を関数に渡そうとしていますが、上記のコードを実行すると、次のエラーと警告が発生します。

temp.c: 関数 'main' 内:
temp.c:6:5: 警告: 関数 'malloc' の暗黙の宣言 [-Wimplicit-function-declaration]
temp.c:6:13: 警告: 組み込み関数 'malloc' の互換性のない暗黙の宣言 [デフォルトで有効]
temp.c:10:5: 警告: 関数 'test' の暗黙の宣言 [-Wimplicit-function-declaration]
temp.c: トップレベル:
temp.c:15:5: エラー: 'test' のタイプが競合しています
temp.c:15:1: 注: デフォルトの昇格を持つ引数の型は、空のパラメーター名リスト宣言と一致できません
temp.c:10:5: 注: 'test' の以前の暗黙の宣言はここにありました
temp.c: 関数 'test' 内:
temp.c:16:5: 警告: 関数 'strcmp' の暗黙の宣言 [-Wimplicit-function-declaration]

私は問題が何であるかを理解しようとしています。

4

4 に答える 4

7

まず、必要なヘッダーファイルをインクルードする必要があります。strcmpあなたが必要とするため<string.h>に、のためにmalloc <malloc.h>。また、少なくともmainの前にtestを宣言する必要があります。これを行うと、次のエラーに気付くでしょう。

temp.c:関数内'test':
temp.c:20:5:警告:「strcmp」の引数1を渡すと、キャストなしで整数からポインターが作成されます[デフォルトで有効]
/usr/include/string.h:143:12:注:「constchar *」が必要ですが、引数は「char」型です。

これは、を最初の引数としてtest()持つ必要があることを示しています。char *全体として、コードは次のようになります。

#include <string.h>      /* for strcmp */
#include <malloc.h>      /* for malloc */

int test(char*,char**);  /* added declaration */    

int main(){
    char **array;
    char a[5];
    int n = 5;

    array = malloc(sizeof(*array));
    array[0] = malloc(n * sizeof(**array));

    /*Some code to assign array values*/

    test(a, array);

    free(*array); /* free the not longer needed memory */
    free(array);

    return 0;
}

int test(char * s1, char **s2){ /* changed to char* */
    if(strcmp(s1, s2[0]) != 0) /* have a look at the comment after the code */
        return 1;

    return 0;
}

編集

strcmpnullで終了するバイト文字列で機能することに注意してください。nullバイトs1も含まれていない場合、呼び出しはセグメンテーション違反になります。s2test

[1] 14940セグメンテーション違反(コアダンプ)./a.out

両方にヌルバイトが含まれていることを確認するか、 :の署名を'\0'使用して変更してください。strncmptest

int test(char * s1, char **s2, unsigned count){
    if(strncmp(s1, s2[0], count) != 0)
        return 1;
    return 0;
}

/* don' forget to change the declaration to 
      int test(char*,char**,unsigned)
   and call it with test(a,array,min(sizeof(a),n))
*/

また、メモリの割り当てが間違っています。arrayですchar***arrayそれ自体がであるメモリを割り当てますchar*。この特定のポインタにメモリを割り当てることは決してありませんarray[0] = malloc(n*sizeof(**array))

array = malloc(sizeof(*array));
*array = malloc(n * sizeof(**array));
于 2012-07-31T08:19:59.843 に答える
3

エラー 1

temp.c:6:13: warning: incompatible implicit declaration of 
built-in function ‘malloc’ [enabled by default]

これのことですか?

array = malloc(n * sizeof(*array));

エラー 2

temp.c:15:5: error: conflicting types for ‘test’
temp.c:15:1: note: an argument type that has a default promotion can’t 
             match an empty     parameter name list declaration
temp.c:10:5: note: previous implicit declaration of ‘test’ was here

配列の最初の要素のアドレスを渡していますa:

 test(a, array);

したがって、関数のシグネチャは次のようになります。

int test(char* s1, char** s2)
于 2012-07-31T08:12:34.543 に答える
3

いくつかの問題があります。1 つ目は、プロトタイプが間違っていることです。関数に渡すと、データ型がacharポインターに減衰するため、次のものが必要です。

int test (char* s1, char** s2) { ... }

ただし、これを修正しても、test最初に使用するときは宣言がスコープ内にありません。プロトタイプを提供する必要があります。

int test (char* s1, char** s2);

before main、または単に定義全体 (関数) を before に移動しmainます。

さらに、およびのプロトタイプも利用できるように#includestring.hおよびヘッダーを忘れないでください。stdlib.hstrcmpmalloc

于 2012-07-31T08:16:24.947 に答える
1

char の配列を関数に渡すと、引数はポインターに減衰します。関数の引数を次のように変更します

 int test(char* s1, char **s2);
              ^
              ^ 

コードは少なくともコンパイルする必要があります

于 2012-07-31T08:12:43.500 に答える