malloc用于C中的结构和指针

普亚

假设我想定义一个表示向量长度及其值的结构:

struct Vector{
    double* x;
    int n;
};

现在,假设我要定义向量y并为其分配内存。

struct Vector *y = (struct Vector*)malloc(sizeof(struct Vector));

我在互联网上的搜索显示我应该分别为x分配内存。

y->x = (double*)malloc(10*sizeof(double));

但是,似乎我为y-> x分配了两次内存,一次为y分配内存,另一次为y-> x分配内存,这似乎浪费了内存。如果让我知道编译器的实际功能以及初始化y和y-> x的正确方法,将不胜感激。

提前致谢。

紫罗兰色

不,您不会y->x两次分配内存

相反,你的结构分配内存(其中包括一个指针)东西该指针指向。

这样想:

         1          2
        +-----+    +------+
y------>|  x------>|  *x  |
        |  n  |    +------+
        +-----+

因此,您实际上需要两个分配(12)来存储所有内容。

另外,您的类型应该是struct Vector *y指针,并且永远不要malloc在C中强制转换void*返回值,因为它可以隐藏某些您不想隐藏的问题-C完全能够将返回值隐式转换为任何其他指针。

而且,当然,您可能希望封装这些向量的创建,以使对它们的管理更加容易,例如:

struct Vector {
    double *data;    // no place for x and n in readable code :-)
    size_t size;
};

struct Vector *newVector (size_t sz) {
    // Try to allocate vector structure.

    struct Vector *retVal = malloc (sizeof (struct Vector));
    if (retVal == NULL)
        return NULL;

    // Try to allocate vector data, free structure if fail.

    retVal->data = malloc (sz * sizeof (double));
    if (retVal->data == NULL) {
        free (retVal);
        return NULL;
    }

    // Set size and return.

    retVal->size = sz;
    return retVal;
}

void delVector (struct Vector *vector) {
    // Can safely assume vector is NULL or fully built.

    if (vector != NULL) {
        free (vector->data);
        free (vector);
    }
}

通过像这样封装创建的内容,可以确保矢量是完全构建的还是完全不构建的-不可能半构建向量。它还允许您将来完全更改基础数据结构,而不会影响客户端(例如,如果要使它们稀疏阵列以牺牲空间来提高速度)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++ malloc用于结构体中的数组

来自分类Dev

Rust和C / C ++指针之间的比较,用于访问结构中的值

来自分类Dev

C中的动态结构和指针

来自分类Dev

C中的结构,typedef和指针

来自分类Dev

结构和指针C ++

来自分类Dev

C指针和结构

来自分类Dev

C 中的指针问题、struct 中的 struct 和 malloc

来自分类Dev

malloc和汇编中的指针

来自分类Dev

C中带有指针和结构数组的结构

来自分类Dev

C结构和malloc函数

来自分类Dev

在C和C ++中通过指针访问结构

来自分类Dev

malloc和指针的指针

来自分类Dev

C,关于指针(或指向指针的指针?),**和malloc

来自分类Dev

数组和结构中的指针

来自分类Dev

C语言的指针和结构

来自分类Dev

C的结构和指针的混乱

来自分类Dev

C指针的结构和引用的指针

来自分类Dev

结构和指针在C中无法正常工作

来自分类Dev

为结构C ++中的指针分配和删除内存

来自分类Dev

用C中的结构和指针理解变量

来自分类Dev

C中的箭头运算符(指针和结构)错误

来自分类Dev

C:指针算术和 malloc() - 不行吗?

来自分类Dev

需要 C 编程帮助:指针和 malloc

来自分类Dev

结构指针在C中的继承?

来自分类Dev

在C中复制结构的指针

来自分类Dev

C ++中结构的指针数组

来自分类Dev

C-带指针结构的循环中的malloc

来自分类Dev

具有malloc-expression的结构的指针预期错误C

来自分类Dev

C ++:映射结构中的结构指针