Указатель не является 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;
}
Вы включили 'stdlib.h' и' stdio.h'? –
уверен, я не получаю предупреждения. – user3763903
Да, конечно, вы не получаете предупреждения, компилятор не заботится и ** не может ** беспокоиться о правильности указателей, и вы не указали 'malloc()' указатель 'var [0]' , –