2016-10-26 41 views
-1
#include<stdio.h> 
#define NUMBER_OF_CHARS 256 

typedef struct Frequency Frequency; 
struct Frequency { 
    // Frequency value: 
    int v; 
}; 

typedef struct Context Context; 
struct Context { 
    Frequency table[NUMBER_OF_CHARS]; 
}; 

int main(){ 
Context* x; 
(x->table[0]).v=10; 
//printf("%d\n",(x->table[0]).v); 
} 

如果我註釋掉printf,我運行該程序,然後出現分段錯誤;如果我用printf運行程序,那麼我將得到值10.爲什麼它發生?爲什麼printf有助於防止以下代碼中出現分段錯誤?

+2

你用' - 上未初始化的指針 –

+3

訪問一個未初始化的指針>'是不確定的行爲。什麼事情都可能發生。 – Ari0nhh

+1

以上內容應理解爲:**任何** *都可能發生。 – user2864740

回答

0

如上述註釋中所述,您使用的是x變量,它是一個指針並且未分配。您可以使用以下方法:

int main(){ 
    Context x; // you are allocated on the stack a Context value 
    x.table[0].v=10; // set the Frequency of first item 
    //printf("%d\n",(x.table[0].v); 
    return (0); 
} 

相反的:

int main(){ 
    Context* x; 
    (x->table[0]).v=10; 
    //printf("%d\n",(x->table[0]).v); 
    return (0); 
} 
+0

我可以做上下文* x = malloc(sizeof(Context)),然後做(x-> table [0])。v = 10? –

+0

@QiqinZhao使用Context * x = malloc(sizeof(Context));',但不要忘記在使用這個指針後添加'free(x);'。 –

相關問題