假设我们有一个像这样的简单结构:
typedef struct
{
int d1;
int d2;
float f1;
}Type;
为它的新实例分配内存时,哪个是正确的:
这个:
// sizeof *t == sizeof(Type) ( gcc prints 12 bytes)
Type *t = malloc(sizeof *t);
或:
// sizeof pointer always == 4 (in my case also on gcc)
Type *t = malloc(sizeof(t));
哪个是正确的?
最佳答案
正确的做法是:
Type *t = malloc(sizeof *t);
为什么这是正确的?
因为您正确地分配了一个足够大的大小来容纳一个结构。 *t
指向一个类型Type
。
这是不正确的方式:
Type *t = malloc(sizeof(t));
为什么这是不正确的?
sizeof(t)
返回指针的大小而不是实际类型(即:不是结构的大小)。
您需要分配的大小足以容纳一个大小不等于结构指针的结构。
请注意,指向Any 类型的指针的大小在系统上是相同的。
为什么第一种方法更好?
使用第一种方法时,当您更改 Type
时,malloc
会自动将大小更改为正确的值,与其他方法不同,您不必显式地执行此操作。
此外,编写 malloc
调用的重要部分是找到需要传递的正确大小。最好的方法是不要看任何地方(因为那是我们犯错误的时候),而只看这个 malloc
语句的左侧。因为,在这种情况下它是 t
,因此正确的大小将是 sizeof(*t)
。
如何规范malloc
的使用?
使用上面提到的正确方法有一个问题,如果我们想 malloc
说 30 个元素
。然后我们的 malloc
表达式变成:
t = (T *) malloc(30 * sizeof (*T));
这不是编写 malloc
表达式的首选方法,因为在 malloc
中输入数字 30
可能会出错范围。我们想要什么 - 无论需要多少元素,malloc
参数都应该始终是标准的 sizeof(*x)
或类似的东西。
所以这是一个带有示例的方法:
假设我们有一个指针p
,指向一个大小为20
的一维数组,它的每个元素都是struct node
。声明将是:
struct node (*p) [20];
现在,如果我们希望 malloc
20 elements
of stuct node
,并且希望指针 p
应该持有malloc
的返回地址然后我们有
p = (data-type of p) malloc (size of 20 elements of struct node);
要找到p
的数据类型,为了强制转换,我们只需让变量名消失或将p
替换为空白。所以我们现在有
p = (struct node (*)[20] ) malloc(size of 20 elements of struct node);
我们不能在这里出错,因为如果我们错了,编译器会报错。尺寸终于出来了!我们只是按照我们描述的标准方式,即
p = (struct node (*)[20] ) malloc(sizeof (*p));
我们完成了!
关于c - 为 C 中的结构分配内存时,哪个是正确的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7372580/