使用 malloc 为结构分配内存,其中数据条目之一是指针

Memory allocation for struct using malloc where one of the data entries a pointer

我了解使用 malloc 为结构数组分配内存和为结构指针数组分配内存之间的区别。但是我想使用 malloc 为结构数组分配内存,以防结构本身包含指向另一个结构的指针。这是我要执行的操作的代码:

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

typedef struct linkedlist {
    int pCol;
    struct linkedlist *next;
} plist;

typedef struct particle {
    int color;
    double rad;
    double rx;
    double ry;
    double vx;
    double vy;
    struct linkedlist *event;
} state;

int main()
{
    int N = 5, w = 4;

    plist *ls = (plist*)malloc((N+w)*sizeof(plist));
    printf("N=%d, w=%d, sizeof state=%d, total=%d, sizeof discs=%d\n\n",
    N,w,sizeof(plist), (N+w)*sizeof(plist), sizeof(ls));

    state *discs = (state*)malloc((N+w)*sizeof(state));
    printf("N=%d, w=%d, sizeof state=%d, total=%d, sizeof discs=%d\n",
    N,w,sizeof(state), (N+w)*sizeof(state), sizeof(discs));
    return 0;
}

当我运行这个时,我得到以下输出:

N=5, w=4, sizeof plist=8, total=72, sizof ls=4

N=5, w=4, sizeof state=56, total=504, sizof discs=4

所以,我想知道为什么 ls 或 discs 只分配了 4 个字节,我怎样才能获得为这些结构数组分配的 内存?

您打印的是指针 (ls) 的大小,而不是指针 (*ls) 指向的 datatype/structrure 的大小。

如果您打算查找 pliststate 的大小,请在您的 printf 语句中执行 sizeof(*ls)sizeof(*discs),因为那是 lsdiscs指向。

如果您正在考虑通过 malloc 打印分配给 lsdiscs 的总大小。这是不可能的。它不会打印 ((N+w)*sizeof(plist))。 所以即使做 sizeof(*ls) 也不会告诉你你分配了多少 plist 结构

在您的代码中,lsplist * 类型,即指针。

sizeof() 是一个运算符,它 returns 数据类型的 大小 ,而不是分配的内存量。

discs也是如此。