C 初学者结构

C 初学者结构,c,struct,structure,C,Struct,Structure,我是结构新手,我正在尝试做一些教程,看看我是否理解我所学的东西。以下是我编写的代码: #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));

我是结构新手,我正在尝试做一些教程,看看我是否理解我所学的东西。以下是我编写的代码:

#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]等等


回答第一个问题:是的,您的代码完全正确。你甚至把它放了,我有点骄傲

至于第二个问题,我有点不确定你的意思,但是当你调用mallocN*sizeoftype时,在你的例子中N是一个整数,它只会是1,你本质上只是创建了一个类型为N的元素数组。因此,当N=1时,pv[0]是该阵列中的第一个也是唯一一个元素,并且pv[1],pv[2]等不存在


但是,您应该使用语法pv->Vx而不是pv[0].Vx.

来回答第一个问题:是的,您的代码完全正确。你甚至把它放了,我有点骄傲

至于第二个问题,我有点不确定你的意思,但是当你调用mallocN*sizeoftype时,在你的例子中N是一个整数,它只会是1,你本质上只是创建了一个类型为N的元素数组。因此,当N=1时,pv[0]是该阵列中的第一个也是唯一一个元素,并且pv[1],pv[2]等不存在


但是,您应该使用语法pv->Vx而不是pv[0].Vx。

您的代码是正确的,但是您使用的语法有点奇怪。运算符[n]的意思是:将指针的地址取为pv中的值,增加n,然后取消引用。因为地址n=0不是递增的,所以可以取消对它的引用。您可以使用*pv,或者简单地使用pv->。只有在分配了多个结构并希望将地址设置为其中一个结构时,才需要[]运算符。pv[3]将与*pv+3相同。但如果要将指针用作数组,首先必须分配更多空间:


mallocsizeofvelocity*4

您的代码是正确的,但是您使用的语法有点奇怪。运算符[n]的意思是:将指针的地址取为pv中的值,增加n,然后取消引用。因为地址n=0不是递增的,所以可以取消对它的引用。您可以使用*pv,或者简单地使用pv->。只有在分配了多个结构并希望将地址设置为其中一个结构时,才需要[]运算符。pv[3]将与*pv+3相同。但如果要将指针用作数组,首先必须分配更多空间:

mallocsizeofvelocity*4

是的,您以正确的方式使用了变量

在代码中,您只为变量的一个实例分配了内存。所以,如果你写pv[0].Vx或者pv->Vx也是一样的。如果要为n个实例分配内存,可以使用pv[k].Vx,其中0 是的,您以正确的方式使用了变量


在代码中,您只为变量的一个实例分配了内存。所以,如果你写pv[0].Vx或者pv->Vx也是一样的。如果要为n个实例分配内存,可以使用pv[k].Vx,其中0这里的数组下标符号有误导性。我建议您改用pv->Vx=1等。另外,不要强制转换malloc的返回值,除非您有强烈的愿望这样做,否则不要键入定义结构的内容。哦,检查malloc是否成功或返回NULL。@5gon12eder您反对typedefing结构的理由是什么?@2501它增加了额外的复杂性/混乱,但没有真正的好处。在上面的示例中,当struct-velocity正好可以使用时,为什么要使用变量和速度这两个名称?我也不喜欢通过将结构隐藏在typedef中来模糊程序的语义。@5gon12eder它是如何增加混乱或复杂性的。您有一个结构类型或一个类型。就用一个。在上面的示例中,当struct-velocity正好可以使用时,为什么要使用变量和速度这两个名称?我不明白这部分。不带struct前缀的velocity与struct velocity完全相同,只是您不必键入struct。减少输入的文本会降低复杂性。@2501您遇到了C语言的主要风格争论之一。每个程序员都会非常强烈地感受到是否应该定义结构。他们只是不可能都同意。这里的数组下标符号有误导性。我建议您改用pv->Vx=1等。另外,不要强制转换malloc的返回值,除非您有强烈的愿望这样做,否则不要键入定义结构的内容。哦,检查malloc是否成功或返回NULL。@5gon12eder您反对typedefing结构的理由是什么?@2501它增加了额外的复杂性/混乱,但没有真正的好处。在上面的示例中,当struct-velocity正好可以使用时,为什么要使用变量和速度这两个名称?我也不喜欢通过将结构隐藏在typedef中来模糊程序的语义。@5gon12eder它是如何增加混乱或复杂性的。你有两个
保存结构类型或类型。就用一个。在上面的示例中,当struct-velocity正好可以使用时,为什么要使用变量和速度这两个名称?我不明白这部分。不带struct前缀的velocity与struct velocity完全相同,只是您不必键入struct。减少输入的文本会降低复杂性。@2501您遇到了C语言的主要风格争论之一。每个程序员都会非常强烈地感受到是否应该定义结构。他们不会都同意的。首先谢谢你的回答!实际上我认为sizeofvelocity会为3个浮动分配足够的空间3*sizeoffloat。。。我还尝试用1替换0,但它仍然有效。。。这怎么可能?sizeofvelocity将为1个速度变量分配足够的空间。这将足以容纳构成速度的3个浮子。至于pv[1]工作,这意味着You很幸运,可以访问该内存。pv[1]在阵列结束后访问内存。这导致了所谓的未定义行为,这意味着所发生的事情完全取决于编译器和/或操作系统要做什么。对你来说,你很幸运,但你的程序也可能崩溃。首先感谢你的回答!实际上我认为sizeofvelocity会为3个浮动分配足够的空间3*sizeoffloat。。。我还尝试用1替换0,但它仍然有效。。。这怎么可能?sizeofvelocity将为1个速度变量分配足够的空间。这将足以容纳构成速度的3个浮子。至于pv[1]工作,这意味着You很幸运,可以访问该内存。pv[1]在阵列结束后访问内存。这导致了所谓的未定义行为,这意味着所发生的事情完全取决于编译器和/或操作系统要做什么。对你来说,你很幸运,但你的程序也可能崩溃。谢谢你接受我的回答。我发现了一个小错误:应该是malloc…*4当我们希望pv[3]有效时,因为与任何数组一样,它从0到3,总计为4个元素。感谢接受我的回答。我发现了一个小错误:应该是malloc…*4当我们希望pv[3]有效时,因为与任何数组一样,它从0到3,总计为4个元素。