我是结构新手,我正在尝试做一些教程,看看我是否理解了我一直在学习的内容。这是我写的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct variables{
float Vx;
float Vy;
float Vz;
}velocity;
int main(){
velocity *pv;
pv = (velocity*)malloc(sizeof(velocity));
pv[0].Vx = 1;
pv[0].Vy = 2;
pv[0].Vz = 3;
free(pv);
return 0;
}
所以我的问题是2:
我是否以正确的方式分配了三个变量?
由于我正在使用数组表示法,我为什么要写[0]
而不是[1]
或[2]
左右?
答案 0 :(得分:5)
回答第一个问题:是的,您的代码完全正确。 (你甚至free
正确,我有点自豪!)
关于第二个问题,我有点不确定你的意思,但是当你打电话给malloc(N * sizeof(type))
时,其中 N 是一个整数(在你的情况下,它只是{ {1}}),您实质上只是创建1
的 N 元素数组。因此,当{em> N = 1且type
,pv[0]
等不存在时,pv[1]
是此数组中的第一个也是唯一的元素。
但是,您应该使用语法pv[2]
而不是pv->Vx
。
答案 1 :(得分:3)
您的代码是正确的,但您使用的语法有点奇怪。运算符[n]
表示:获取指针的地址(在您的情况下为pv
中的值),将其递增n,并取消引用它。由于您没有递增地址(n = 0),因此您可以取消引用它。您可以使用*pv
或仅使用pv->
执行此操作。分配多个结构时,只需要[]
运算符,并希望将地址设置为其中一个结构。 pv[3]
将与*(pv+3)
相同。但是,如果要将指针用作数组,首先必须分配更多空间:
malloc(sizeof(velocity) * 4)
答案 2 :(得分:2)
是的,您以正确的方式使用了变量。
在您的代码中,您只为一个变量实例分配了内存。所以,如果你写pv[0].Vx
或pv->Vx
,情况就一样。如果要为n
个实例分配内存,可以使用pv[k].Vx
,其中0<=k<=n-1
。
SideNote:请do not cast malloc()
的返回值。