2017-07-29 9 views
0

私のコードで定義された構造体の再帰子がNULL(または空で未使用)であるかどうかを確認するにはどうすればよいですか? (私は彼らがデータでそれらを埋めることができるようにNULLであるかどうかを知りたい)。このラインfs->child[i] == NULLと、このラインでstructの再帰子がNULL(C言語)

#include <stdio.h> 
#include <stdlib.h> 

#define HEIGHT 256 
#define LENGTH 256 

typedef struct FS FS; 
typedef struct Elem Elem; 

struct Elem { 
    char name[256]; 
    char content[256]; 
    Elem *child[1024]; 
}; 

struct FS { 
    Elem *child[1024]; 
}; 

void create(FS *fs, char path[HEIGHT][LENGTH]){ 

    while(i<1024){ 

     if(fs->child[i] == NULL){ //check if child[i] is NULL, if so I can fill it with data 

      Elem *e; 
      e = malloc(sizeof (Elem)); 
      fs->child[i] = e; 
      strcpy(e->name, path[0]); 
      i = 1024; 
     } 
     i++; 
    } 
} 

int main(void) { 

    FS *fs; 
    char path[HEIGHT][LENGTH]; 

    create(fs, path); 

    return 0; 
} 

それは実行時にSegmentation fault: 11を返しfs->child[i] = e。私は間違って何をしていますか?

+2

あなたは 'fs'に有効なポインタ値を割り当てませんでした。したがって、 'fs - > ...'は不正なアドレス参照です。 – lurker

+0

'fs'はどこで作成しますか? –

+0

まず、 'malloc'のどこかで' fs'に有効なポインタを割り当て、 'memset'ですべてをゼロに初期化する必要があります。 –

答えて

1

FS *fs;が代わりにFS *fs = (FS*) malloc (sizeof(FS));である必要があります。ほとんどの場合、メモリブロックの割り当て方法はわかっていますが、忘れてしまったように見えます。しかし、それを作ることを忘れないでくださいfree(fs);

+0

[mallocの戻り値をキャストしない](https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – lurker

+0

@lurkerだから、あなたは何かをするように提案する代わりに 'FS * fs = malloc(sizeof(FS));'? –

+0

はい。私が提供したリンクを参照してください。 – lurker

関連する問題