2016-10-26 6 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 (Контекст)), а затем выполнить (x-> table [0]). V = 10? –

+0

@QiqinZhao без проблем использовать 'Context * x = malloc (sizeof (Context));', но не забудьте добавить 'free (x);' после использования этого указателя. –

Смежные вопросы