0

私は、各文字を読み取った後にメモリを動的に割り当てるchar配列にデータを読み取って保存したいファイルを持っています。必要なサイズのメモリを正確に動的に割り当てたい。ここに私が持っているものがあります:

FILE *fp;
char *data;
int c=0;

fp=fopen("home/bob/Downloads/filename", "r");
data=malloc(sizeof(char));

do{
    data[c]=fgetc(fp);
    printf("data : %c\n", data[c]);
    c++;
    data=realloc(data, sizeof(char)+c);
} while(data[c]!=EOF);

セグメンテーション違反が発生します。

4

6 に答える 6

2

問題はおそらくここにあります:

while(data[c]!=EOF)

ループ内で増加 することに注意してください。割り当てたメモリの初期化されていない部分も同様です。これは、この初期化されていないデータがファイルの実際の末尾をはるかに超えていない限り、1 文字ずつ読み取り続けることを意味します。cdata[c](char) -1

代わりに、次のようにしてみてください。

char *data = NULL;
size_t c = 0;

for (;;)
{
    const int ch = fgets(fp);
    if (ch == EOF)
        break;  /* Error or end of file */

    char *tmp = realloc(data, c + 1);
    if (tmp == NULL)
        break;  /* Could not allocate memory */

    data = tmp;
    data[c++] = ch;
}
于 2013-10-01T08:37:04.463 に答える
1

まず、malloc coz malloc return a void* で型キャストを使用する必要があります。

data=(char*)malloc(sizeof(char));

また、EOF は char ではありません (EOF=-1)

while ループ内の条件は、メモリのまだ初期化されていない部分を指しています。

int ch;
while(1)
{
if( (ch=fgets(fp))==EOF )
    break;
data[c]=ch;
c++;
data=realloc(data, sizeof(char)+c);
}
于 2013-10-01T10:17:16.270 に答える
1

プログラムが次の条件を評価しようとするまでに:

(data[c]!=EOF)

cすでにインクリメントされているため、配列data[c]の範囲外の要素にアクセスしようとすると、未定義の動作が発生します。data

于 2013-10-01T08:34:47.310 に答える
0

1 バイトのメモリを割り当てました。これは、ファイルを読み取るのに十分ではありません。

Cでファイルのサイズをどのstat()ように決定しますか?サイズを取得してから割り当てsize*sizeof(char)ます。

#include <sys/stat.h>

off_t fsize(const char *filename) {
    struct stat st; 

    if (stat(filename, &st) == 0)
        return st.st_size;

    return -1; 
}

{
    FILE *fp;
    char *data;
    int c=0;
    off_t size = fsize("home/bob/Downloads/filename") +1;

    fp=fopen("home/bob/Downloads/filename", "r");
    data=malloc(sizeof(char) * size);

    do{
        data[c]=fgetc(fp);
        printf("data : %c\n", data[c]);
        c++;
        data=realloc(data, sizeof(char)+c);
    }while(data[c]!=EOF);
}
于 2013-10-01T08:34:07.300 に答える
0
do{
    data[c]=fgetc(fp);
    printf("data : %c\n", data[c]);
    c++;
    data=realloc(data, sizeof(char)+c);
}while(data[c]!=EOF);  // this should be the location of the seg fault

While (data[c]) は、配列の末尾の後ろを調べます。

行う

}while(data[c - 1]!=EOF);

または、チェックの後に c をインクリメントします

于 2013-10-01T08:34:54.230 に答える
0
data[c]=fgetc(fp);  --> This gives seg fault 

あなたはこのように増加しているのでc++

data=malloc(sizeof(char));

dataするとUBになるsizeof(char)時の記憶を指します。c++data[c]

于 2013-10-01T08:35:08.217 に答える