1

ファイルを受け取り、それを 1 行ずつ読み取り、すべての行を に*char[]入れ、この 2 次元配列を構造体に入れ、この構造体wordlist.h を返す関数があります。

#ifndef H_WORDLIST
#define H_WORDLIST
typedef struct {
    char **chWordsList;
    int listlen;
}Wordlist;
Wordlist getWordlistFromFile(char *chFilename);
char *getRandomWord();
#endif

関数 (およびヘッダー):

#include "wordlist.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define WORDSIZE 100

Wordlist getWordlistFromFile(char *chFilename){
    FILE *file = fopen(chFilename,"r");
    if (file == NULL){
        printf("Unable to open file %s. Check if the file exists and can be read by this user.\n",chFilename);
        exit(1);
    }
    char chWord[WORDSIZE];
    int intFileSize = 0;
    //First: coundt the amount of lines in the file
    while((fgets(chWord,WORDSIZE,file) != NULL)){
        ++intFileSize;
    }
    rewind(file);
    char *chWordList[intFileSize];
    for (int count = 0; (fgets(chWord,WORDSIZE,file) != NULL); ++count){
        chWordList[count] = malloc( strlen(chWord +1));
        strcpy(chWordList[count],chWord);
        chWordList[count][strlen(chWord) -1] = 0;
    }
    fclose(file);
    Wordlist wordlist;
    wordlist.chWordsList = chWordList;
    wordlist.listlen = intFileSize;
    for (int i = 0; i < wordlist.listlen; ++i){
        printf("%s\n", wordlist.chWordsList[i]);
    }
    return wordlist;
}

これまでのところ、これはうまく機能します。最後の for ループは、指定されたファイルのすべての行を正確に出力し、すべてが完全に期待される動作であり、完璧に機能します。さて、実際に機能を使いたいと思います。だから:私のmain.cで:

Wordlist list = getWordlistFromFile(strFilePath);
for (int i = 0; i < list.listlen; ++i){
    printf("%s\n", list.chWordsList[i]);
}

これにより、最も奇妙な出力が得られます。

abacus
wordlist
(null)
(null)
��Ⳏ
E����H�E
gasses

出力は次のようになります。

abacus
amused
amours
arabic
cocain
cursor
gasses

いくつかのポインターが d か何かを取得するように思えますがfree、他のポインターはそのまま残ります。何が起こっている?wordlist返品前​​は完璧で、返品後は壊れているのはなぜですか?

4

3 に答える 3