首页 文章

使用malloc的struct的内存分配,其中一个数据条目是指针

提问于
浏览
2

我理解使用malloc为struct数组和struct指向数组的内存分配之间的区别 . 但是我希望使用malloc为struct数组分配内存,在struct本身包含指向另一个struct的指针的情况下 . 这是我想要做的代码:

#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或光盘只被分配4个字节,我怎样才能获得为这些结构数组分配的总内存?

2 回答

  • 1

    您正在打印指针(ls)的大小,而不是指针指向的数据类型/ structrure的大小(* ls) .

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

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

  • 2

    在您的代码中, ls 的类型为 plist * ,.i.e . ,一个指针 .

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

    同样适用于 discs .

相关问题