0

GCCでコンパイルした後、このコードをWindows 7(問題がある場合は64ビット)で実行しようとしています。bufsize を int として宣言すると、プログラムがフリーズし、Windows が動作を停止したことを通知します。#define bufsize 123 を使用すると問題なく動作し、自分で bufsize を数値に置き換えても問題なく動作します。ここで何が欠けていますか?

int main(int argc, char* argv[]) {

    char* filename = argv[1];

    FILE* problem = fopen(filename, "r");
    if (!problem) {
        printf("File doesn't exist\n");
        exit(1);
    }

    char* line;
    while (fgets(line, bufsize, problem) != NULL) {        
        printf(line);
    }


    return 0;
}
4

4 に答える 4

2

lineはポインターですが、どこも指していません (または、初期化されておらず、その値が不確定で使用できません)。どこも指していないポインタはあまり役に立ちません。

いくつかのメモリを割り当て、そのメモリをlineポイントします。メモリが不要になったら、忘れずにメモリの割り当てを解除してください。

line = malloc(200);
if (line == NULL) { /* something went wrong, the pointer is pointing nowhere */ }
/* ... use allocated memory ... */
free(line);

ああ...bufsize値は、割り当てたバイト数と一致する必要があります。

また、そこにプロトタイプがある#include <stdlib.h>ためです。malloc()free()

于 2010-09-19T17:47:57.660 に答える
1

が指すバッファに領域が割り当てられていませんline

やったほうがいい:

line = malloc(bufsize);

次を使用して解放します。

free(line);
于 2010-09-19T17:44:41.383 に答える
1

bufsizeに割り当てて渡すことになっているバッファのサイズですfgets。バッファをまったく割り当てていないため、fgets特定のサイズのバッファを渡していると嘘をついています。使用しているサイズやそれを渡す方法は問題ではありませんfgets。バッファーを割り当てていない限り、コードはクラッシュしたり、予期しない動作をしたりします。

バッファー サイズがそれほど大きくない限り、動的に割り当てる代わりに、ローカル配列として宣言できます。

char line[bufsize];
while (fgets(line, bufsize, problem) != NULL) {        
    printf(line);
}
于 2010-09-19T17:54:55.403 に答える
0
char* line = malloc(bufsize);
于 2010-09-19T17:54:09.977 に答える