2016-05-05 6 views
-1

単純なファイルを1行ずつ読み込んでその内容を配列に保存します。ソースコードをコンパイルすると、次のエラーが表示されます。リターンで 'char(*)[1024]'を 'char *'に変換できません

test.C: In function ‘char* read_file(int, int, const char*)’: 
test.C:14:11: error: cannot convert ‘char (*)[1024]’ to ‘char*’ in return 
    return words; 
     ^

これはどういう意味ですか? 2D配列のポインタを返すことができないのはなぜですか?ここにソースコードがあります。

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

char * read_file(int buf, int size, const char *fname){ 
    char words[size][buf]; 
    FILE *fptr = NULL; 
    int idx = 0; 

    fptr = fopen(fname, "r"); 
    while(fgets(words[idx], buf, fptr)) { 
     words[idx][strlen(words[idx]) - 1] = '\0'; 
     idx++; 
    } 
    return words; 
} 

int main(void) { 
    char * words; 
    words = read_file(1024, 100, "text.txt"); 
    int i; 
    for(i = 0; i < 100; ++i) 
     printf("%s\n", words[i]); 
} 
+0

'char型の言葉[サイズ] [BUF];' - 自動ストレージ、> GONE <返品後。 –

+0

この変換エラーに関係なく、これが何をしようとしているかはわかりません。ラシャネのコメントのリンクは重要です。 – WhozCraig

答えて

5

は、あなたが実際に問題を抱えている:最初のものはエラーについてです。配列charの配列は、charへのポインタと同じではありません。配列がポインタに崩壊すると、charの配列の配列は、charの配列へのポインタ、または具体的にはchar (*)[buf]の配列に相当します。

2番目の問題は悪化し、ローカル変数へのポインタを返そうとしています。ローカル変数は、関数が戻ったら範囲外になり、基本的に存在しなくなります。したがって、関数が返っても、ポインタはもはや有効ではありません。

可変長配列を使用するため、charへのポインタ(つまりchar **)へのポインタとして、配列を動的に割り当てることをお勧めします。別の解決策は、配列を引数として渡すことです。


最も簡単な解決策は、私の意見では、main機能で配列を宣言し、関数に渡し、あなたはポインタと動的割り当てを気にする必要があり、より具体的にメモリを解放していないその方法後で。

このような何か:

#define STRING_COUNT 100 // Number of strings 
#define STRING_SIZE 1024 // Size of each string 

// Open and read the file, returns the number of "words" read 
size_t read_file(const char *filename, char (*words)[STRING_SIZE]) 
{ 
    // Implement the function... 
    // Don't forget to return the number of "words", actually lines, you read 
} 

int main(void) 
{ 
    char words[STRING_COUNT][STRING_SIZE]; 
    size_t number_words = read_file("test.txt", words); 

    // Use the "words" here... 
    ... 

    return 0; 
} 
+0

こんにちは、お返事いただきありがとうございます、私に短い例を教えてください。 – Sam

+0

@Sam単純な(不完全な)サンプルを追加し、配列を引数として渡す方法を示しました。 –

+0

ありがとう、私は見てみましょう。 – Sam

関連する問題