0

文字列の配列をファイルの行で埋める関数を作成しようとしていますが、コンパイラ (GCC) はまだ警告を出しています。コンパイルされたアプリを実行しようとすると、「セグメンテーション違反」エラーが発生します
ソース コード:

主要

#include <stdio.h>

#include "getAdresses.h"

int main(int argc, char **argv){
        char adresses[1024][128];
        getAdresses(adresses);
        printf("%s", adresses[1]);

}

getAddresses

include <stdio.h>

int getAdresses(char **adresses){
        FILE *fr;
        fr = fopen("adresses", "r");
        int i = 0;
        while(adresses[i-1][0] != EOF){
                fscanf(fr, "%s\n", &adresses[i]);
                i++;
        }
}

それは私にこのエラーを与えています:

main.c: In function ‘main’:
main.c:9:2: warning: passing argument 1 of ‘getAdresses’ from incompatible pointer type [enabled by default]
In file included from main.c:3:0:
getAdresses.h:1:5: note: expected ‘char **’ but argument is of type ‘char (*)[128]’
4

3 に答える 3

1

まず第一に、あなたは典型的な間違いを犯しました:char **はa と同じではありませんchar (*)[128]。後者は のタイプですadresses

インラインで逆参照しようとすると、セグメンテーション違反が発生します

while(adresses[i-1][0] != EOF)

[i-1]のアドレス指定が悪い結果をi = 0もたらすという事実は別として、関数を次のように定義する必要があります

int getAdresses(char (*adresses)[128])

2次元配列を正しく渡すことができfscanf、実際のラインバッファーにスキャンする必要があります。行ごとに読み取る場合は、次を使用しますfgets

while(fgets(adresses[i], 128, fr)) i++;
于 2013-10-14T16:52:27.523 に答える
0

関数に渡すadresses[1024][128]と、コンパイラは減衰の 1 つのステップのみを実行し、パラメーターの型はchar (*)[128]の代わりにする必要がありchar **ます。

また、最初の次元を関数に渡す必要があります。つまり、

int getAdresses(char (int (*arr)[128], int x)

この問題の詳細な説明については、c-faq を確認してください。

于 2013-10-14T16:52:06.693 に答える
0

宣言して割り当てた配列

char adresses[1024][128]

は実際には a ですchar*(そうではありませんが、 to よりもはるかに近いchar**です)。

double dimension アクセサーは、実際には の構文糖衣です[x+y*width]

配列をパラメーターとして渡すには、次のようにします。

int getAdresses(char (*adresses)[128])
于 2013-10-14T16:53:00.617 に答える