2015-03-08 8 views
0

работы:с массив указателей структура против структура указатель указатель таНос

struct data{ 
    int val; 
}; 

int main(void){ 
    struct data *var[2]; 
    (*var)->val = 6; 
    printf("%d\n", (*var)->val); 
    return 0; 
} 

выдаёт ошибку сегментации:

struct data{ 
    int val; 
}; 

int main(void){ 
    struct data **var = malloc(3 * sizeof(struct data)); 
    (*var)->val = 6; // <- crash 
    printf("%d\n", (*var)->val); 
    return 0; 
} 

может кто-то объяснить, почему выдаёт ошибку сегментации появляется и дать мне работающий пример с минимальными изменениями в коде Segfault что я могу понять PLS.

+0

Вы включили 'stdlib.h' и' stdio.h'? –

+0

уверен, я не получаю предупреждения. – user3763903

+0

Да, конечно, вы не получаете предупреждения, компилятор не заботится и ** не может ** беспокоиться о правильности указателей, и вы не указали 'malloc()' указатель 'var [0]' , –

ответ

0

Указатель не является malloc 'ed, вы разыскиваете неверный указатель, потому что ваш массив представляет собой массив poitners, и его элементы не указывают на действительную память.

Попробуйте

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

struct data 
{ 
    int val; 
}; 

int main(void) 
{ 
    struct data *var[2]; 
    /* You need to malloc before dereferencing `var[0]` */ 
    var[0] = malloc(sizeof(var[0][0])); 
    if (var[0] != NULL) 
    { 
     var[0]->val = 6; 
     printf("%d\n", var[0]->val); 

     free(var[0]); 
    } 
    return 0; 
} 

также, используя (*var)->val = 6 абсолютно ненужным и запутанным.

Во втором случае, вы должны также сделать почти то же самое, за исключением того, что массив указателей является указателем на массив poitners и, следовательно, нуждается в malloc() тоже, так что ваш второй пример случайно работает, потому что имеется достаточно памяти malloc() но это также неправильно, вы должны сделать это таким образом.

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

struct data 
{ 
    int val; 
}; 

int main(void) 
{ 
    struct data **var; 
    var = malloc(2 * sizeof(var[0])); 
    if (var == NULL) 
     return -1; 
    /* You need to malloc before dereferencing `var[0]` */ 
    var[0] = malloc(sizeof(var[0][0])); 
    if (var[0] != NULL) 
    { 
     var[0]->val = 6; 
     printf("%d\n", var[0]->val); 

     free(var[0]); 
    } 
    free(var); 
    return 0; 
} 
+0

, но если malloc возвращает допустимую память, то к тому, что является var, указывающим на Может ли PLS дать мне пример с указателем указателя указателя malloc, чем я бы понял. – user3763903

+0

@ user3763903 теперь я вижу, ваш второй пример работал случайно, но это неверно. –

+0

ahhhhhhhhhhh thx спасибо, я понимаю теперь, что первая точка ** var в память и чем * var .. ok thx например – user3763903

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