2017-10-05 11 views
0

文字列を印刷しようとするとsegfaultが発生します。 ここに問題の文脈がありますが、私は何とか構造体を間違って渡していると思います。 ファイルをロードすると* file_pathが読み込まれ、ドキュメント構造体として返されますが、int main()ではsudoは決してその中にデータを持ちません。私はそれの内側で有効なデータを持っていますが、須藤((int型メインでも、文書の構造体)は、データを取得することはありません)(LOAD_FILEの内部GDBとドキュメントでプログラムを実行します。なぜ?C - 構造体から返された関数が変数に割り当てられていません

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
const char *sudoers_path = "thing"; 
char *read_string = "sandos"; 
int read_string_len = 6; 
struct document{ 
    char *string; 
    int length; 
}; 
struct document sudoers; 
struct document loadfile(char *file_path){ 
    char char_temp[2] = "1"; 
    struct document doc; 
    int temp=0; 
    FILE *file = fopen(file_path,"r"); 
    doc.string = (char *)malloc(10*sizeof(*doc.string)); 
    doc.length=10; 
    int len_doc_read = 0; 
    while(temp != EOF){ 
     temp = fgetc(file); 
    if(temp == EOF){ 
     break; 
    } 
    char_temp[0] = (char) temp; 
    if(doc.length - len_doc_read==0){ 
     doc.string = (char *)realloc(doc.string, (doc.length+10)*sizeof(*doc.string)); 
     for(int i = doc.length; i< len_doc_read-2; i++) 
      doc.string[i]=' '; 
     doc.string[doc.length-1] = '\0'; 
    } 
    len_doc_read++; 
    strcat(doc.string, char_temp); 
    strcat(doc.string, "\0"); 
    doc.length++; 
} 
//I am the cracker of C, destroyer of programming! --me 
if(doc.string = NULL) 
    printf("memory failed"); 
return doc; 
} 

int main(){ 
    struct document sudo = loadfile(sudoers_path); 
    struct document sand_find; 
    sand_find.string = "sandos"; 
    sand_find.length = 7; 
    puts(sudo.string); 
    return 0; 
} 

理由があります私が代わりにNULLをチェックする誤って、あなたが代入され、アーチLinuxと私はそれがあなたのプログラムで

$ gcc main.c -o out 
+1

ステップ1:FILE *ファイル=のfopenの 'の後に戻り値をチェック(FILE_PATHは、 "R");' –

+0

私はあなたが[小さなプログラムをデバッグする方法](HTTPSを読むことをお勧めします: //ericlippert.com/2014/03/05/how-to-debug-small-programs/)をEric Lippertに紹介し、*デバッガ*を使って行ごとにコードをステップ実行する方法を学びます。また、[良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)を読んで、あなたの質問を編集して、あなたが読んだファイルの内容と予想される実際の出力を表示してくださいあなたのプログラムの。 –

+0

私が気づいている事は、 'for(int i = doc.length; i

答えて

3

でコンパイルするために使用していますCOMANDの現代版でプログラムをコンパイルし、実行しています重要INCASE NULLからdoc.string -

if(doc.string = NULL) 

変更それを -

if(doc.string == NULL) 
関連する問題