C语言中struct的数组和字符串的动态内存分配

时间:2016-05-31 12:59:35

标签: c structure dynamic-memory-allocation

我想创建一个struct,但我也想用动态内存分配来编写它的数组或字符串元素。

struct st {
    char *name[40];
    int age;
};

对于“name”字符串,我应该在struct之前使用malloc,还是我也可以在struct中使用它。

1)

char *name = malloc(sizeof(char)*40);

struct st {
    char *name;
    int age;
};

2)

struct st {
    char *name = malloc(sizeof(char)*40);
    int age;
};

他们两个都是真的还是有任何错误?如果它们都是真的,哪一个对代码的其他部分更有用呢?

3 个答案:

答案 0 :(得分:2)

您需要创建结构的实例,它的实际变量。然后,您需要在函数中初始化结构实例的成员。

例如,在某些功能中你可以做到

struct st instance;
instance.name = malloc(...);  // Or use strdup if you have a string ready
instance.age = ...;

答案 1 :(得分:1)

一个选项是在结构中有一个指针但是在你使用它的函数中的结构外部分配内存。

e.g。

struct st {
    char* n;
    int a;
};

void foo() {
    char* name = malloc(sizeof(char) * 40);
    int age = 0;

    struct st s = (struct st) {
        .n = name,
        .a = age,
    };

    /* TO DO */

    free(name);
}

答案 2 :(得分:1)

声明类型不会创建左值(如变量)。它定义了左值的格式。在1)中,您已正确声明了结构类型,但您似乎假设结构声明中“name”变量的相似性将指针“name”与struct member“name”相关联。它不起作用。

2)在语法/语义上是错误的。你根本无法将malloc()赋值给非左值(因为你声明了一个类型结构)

因此,在1)中创建一个结构类型的变量,并在struct变量成员中分配内存。

typedef struct st {
    char *name;
    int age;
} st_type;

st_type st_var;
st_var.name = (char *) malloc(sizeof(char) * 40); // This is how you will allocate the memory for the struct variable.

请记住,在进行动态分配之前,您需要像对独立“名称”变量一样使用左值。