如何初始化动态分配结构的成员

时间:2019-02-05 12:13:14

标签: c dynamic structure

我为两个结构分配了内存,我正在尝试为结构的成员提供一些值,但是它不起作用,我也不知道该怎么做。请帮助我了解发生了什么。这是我的代码:

#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 :(得分:1)

例如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)取消引用指针。

答案 1 :(得分:0)

这就是我想要得到的:

#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;
}

答案 2 :(得分:0)

  1. 请记住检查malloc的返回值,它可以为0。
  2. 此外,我已经重写了您的代码,使得p是指向 2 struct rec 的数组,因此代码主要部分的用法是 更接近您最初想要的东西。
  3. 此外,再也不要投放malloc的结果,您可能会隐藏讨厌的内容 如果您以后更改指针类型,则会导致指针类型不匹配的错误 指针被声明。
  4. 最后,请始终尝试使用malloc惯用语 您所指事物的大小。这样,如果您决定 更改您要malloc着的东西,总是正确的尺寸 返回。

malloc