我理解使用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 回答
您正在打印指针(ls)的大小,而不是指针指向的数据类型/ structrure的大小(* ls) .
如果您打算查找
plist
和state
的大小,请在您的printf语句中执行sizeof(*ls)
和sizeof(*discs)
,因为这是ls
和discs
指向的位置 .如果您打算通过malloc打印分配给
ls
或discs
的总大小 . 这是不可能的 . 它不会打印((N+w)*sizeof(plist))
. 所以即使做sizeof(*ls)
也不会告诉你你分配了多少plist
个结构在您的代码中,
ls
的类型为plist *
,.i.e . ,一个指针 .sizeof()
是一个运算符,它返回数据类型的大小,而不是分配的内存量 .同样适用于
discs
.