2011-12-31 15 views
2

誰も私にこのコードの何が間違っていると教えてもらえますか?私はsegの欠陥を得ています。私は、ファイルの最初の行だけを新しく作成したファイルに読み込もうとしています。小さなfopen/fwrite問題。提案してください

char *buffer; 

int main(int argc, char *argv[]) 
{ 
    FILE *source = fopen(argv[0], "r"); 
    FILE *destination = fopen("destination", "w"); 

    fgets(buffer, 500, source); 
    fwrite(buffer, 1, sizeof(buffer), destination); 

} 
+0

あなたは、コンパイル時に(例えば 'gccの-Wall -g'で)警告&デバッグ情報を依頼すると、(Linuxシステムを仮定して)' gdb'デバッガを使用することを検討しましたか?できるだけ多くの人を助けるようにコンパイラに依頼し、Cでコーディングするときにデバッガを使うことを学ぶべきです。 –

答えて

6

bufferには何も割り当てられていません。

変更:あなたのコードが今あるので

char buffer[500]; 

char *buffer; 

bufferだけ初期化されていないポインタです。逆参照しようとすると、未定義の動作が発生します。 (あなたの場合とSEG-障害)また


、あなたが動的bufferにメモリを割り当てることができます。

buffer = (char*)malloc(500 * sizeof(char)); 

ていますが、後にメモリを解放するために覚えておく必要があります。

free(buffer); 

この後者の方法を使用すると、コードは次のようになります。

char *buffer; 

int main(int argc, char *argv[]) 
{ 
    FILE *source = fopen(argv[0], "r"); 
    FILE *destination = fopen("destination", "w"); 

    // Allocate 
    buffer = (char*)malloc(500 * sizeof(char)); 

    fgets(buffer, 500, source); 
    fwrite(buffer, 1, 500 * sizeof(char), destination); // Fixed here 

    // Free memory 
    free(buffer); 

    // Don't forget return value 
    return 0; 
} 
4

バッファにはサイズがありません。つまり、char配列へのポインタです。読み込むスペースをmallocする必要があります

+1

また、 'sizeof(buffer)'は 'sizeof(char *)'と同じです。あなたが望むものではありません。バッファーが占有するバイト数ではなく、読み込んだバイト数で書き出す必要があります。 –

+0

@DavidSchwartz右。ありがとう、私はそれを逃した。 –

0

データを格納するメモリを割り当てる必要があります。これは、静的arraysを使用して割り当てたり、動的に割り当てられmalloc()

#define BUFLEN 50 

/* static allocation */  
char buffer_array[BUFLEN]; 

/* dynamic allocation */ 
char * buffer_ptr = NULL; 
if ((buffer_ptr = (char *)malloc((int)sizeof(char) * BUFLEN)) == NULL) { 
    printf("ERROR: unable to allocate memory \n"); 
    return 0; 
} 

を使用して、ここで、あなたはbuffer_arrayまたはbuffer_ptrfgets()へと

fwrite()のいずれかを渡すことができます。しかし、次のようにすべての動的に割り当てられたメモリはfree()「EDである必要がありますすることができます。

free(buffer_ptr); 
関連する問題