как инициализировать члены динамически распределенной структуры - PullRequest
0 голосов
/ 05 февраля 2019

Я выделил память для двух структур, и я пытаюсь дать некоторые значения членам структур. Однако, это не работает, и я не знаю, что делать.Пожалуйста, помогите мне понять, что происходит.Это мой код:

#include <stdio.h>
#include <std lib.h>
struct rec{
    int i;
    double f;
    char c;
};

int main(){

    struct rec *p;
    p = (struct rec *) malloc(2*sizeof(struct rec));

    p[0]->i = 10;
    p[0]->f = 3.1;
    p[0]->c = 'a';

    p[1]->i = 20;
    p[1]->f = 6.2;
    p[1]->c = 'b';

    free(p);

    getchar();
    return 0;
}

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Вот что я хотел получить:

#include <stdio.h>
#include <stdlib.h>
struct rec{
    int i;
    double f;
    char c;
};

int main(){
    struct rec *p;
    p = (struct rec *) malloc(2 * sizeof(struct rec));


    (p + 0)->i = 10;
    (p + 0)->f = 3.1;
    (p + 0)->c = 'a';

    (p + 1)->i = 20;
    (p + 1)->f = 6.2;
    (p + 1)->c = 'b';

    printf("%d\t%f\t%c\n", (p + 0)->i, (p + 0)->f, (p + 0)->c);
    printf("%d\t%f\t%c\n", (p + 1)->i, (p + 1)->f, (p + 1)->c);
    free(p);

    getchar();
    return 0;
}
0 голосов
/ 05 февраля 2019
  1. Не забудьте проверить возвращаемое значение malloc, оно может быть 0.
  2. Далее, я переписал ваш код так, что p является указателем на массив2 struct rec, поэтому использование основной части кода ближе к тому, что вы изначально хотели.
  3. Кроме того, никогда не приводите результат malloc, вы можете скрыть неприятные ошибкинесоответствие типов указателей, если вы позже измените тип указателя, который был объявлен.
  4. Наконец, всегда пытайтесь использовать идиому malloc, где вы malloc размер объекта, на который указывает указатель.Таким образом, если вы решите изменить то, что вы malloc, правильный размер всегда будет возвращен.

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

struct rec{
    int i;
    double f;
    char c;
};

int main(void){    
    struct rec (*p)[2] = malloc(sizeof *p);

    if(p)
    {
        (*p)[0].i = 10;
        (*p)[0].f = 3.1;
        (*p)[0].c = 'a';

        (*p)[1].i = 20;
        (*p)[1].f = 6.2;
        (*p)[1].c = 'b';

        printf("%d\t%f\t%c\n", (*p)[0].i, (*p)[0].f, (*p)[0].c);
        printf("%d\t%f\t%c\n", (*p)[1].i, (*p)[1].f, (*p)[1].c);

        free(p);
    }

    getchar();
    return 0;
}
0 голосов
/ 05 февраля 2019

Например, p[0] уже разыменовывает ваш struct rec *p, поэтому при попытке скомпилировать код вы получите следующую ошибку:

error: invalid type argument of ‘->’ (have ‘struct rec’)

и gcc будеттакже укажите, где произошла эта ошибка, например:

p[0]->c = 'a'; (строка исходного кода 14)

Это происходит, поскольку вы пытались разыменовать уже разыменованную p[0].

Теперь, чтобы это исправить, просто замените -> для ., или вы также можете использовать (p + x)-> (x - действительное число, в вашем случае от 0 до 1), чтобы разыменовать указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...