【问题标题】:Structures for beginners适合初学者的结构
【发布时间】:2014-12-16 20:03:31
【问题描述】:

我是结构的新手,我正在尝试做一些教程,看看我是否很好地理解了我所学的内容。这是我写的代码:

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

【问题讨论】:

  • 数组下标符号在这里具有误导性。我建议您改用pv-&gt;Vx = 1 等。也不要投射malloc 的返回值,除非你有强烈的这样做的冲动,否则不要使用typedef'ing 你的structs。哦,然后检查malloc 是成功还是返回NULL
  • @5gon12eder 你反对 typedefing 结构的理由是什么?
  • @2501 它增加了额外的复杂性/混乱,没有真正的好处。在上面的例子中,为什么struct velocity 可以使用variablesvelocity 这两个名字呢?我也不喜欢通过将struct 隐藏在typedef 中来模糊程序的语义。
  • @5gon12eder 它是如何增加混乱或复杂性的。你要么有一个结构类型,要么有一个类型。只用一个。 在上面的例子中,为什么有两个名字 variables 和 velocity 而 struct velocity 就可以了? 我不明白这部分。没有结构前缀的velocitystruct velocity 完全相同,只是您不必键入struct。更少的文字输入减少了“复杂性”。
  • @2501 您遇到了 C 的主要风格争论之一。每个程序员都会非常强烈地考虑是否应该对结构进行 typedef。他们只是不会都同意。

标签: c struct structure


【解决方案1】:

回答第一个问题:是的,您的代码完全正确。 (你甚至free都做得对,我有点自豪!)

至于第二个问题,我有点不确定你的意思,但是当你调用 malloc(<i>N</i> * sizeof(<i>type</i>)) 时,N 是某个整数(在你的情况下,它只是 1 ),您实际上只是创建了一个由<i>type</i>N 个元素组成的数组。因此,当 N=1 且 pv[1]pv[2] 等不存在时,pv[0] 是该数组中的第一个也是唯一一个元素。

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

【讨论】:

  • 首先感谢您的回答!我实际上认为 sizeof(velocity) 会为 3 个浮点数 (3*sizeof(float)) 分配足够的空间...我还尝试将 0 替换为 1 并且它仍然有效...这怎么可能?
  • sizeof(velocity) 将为 1 个velocity 变量分配足够的空间。这足以容纳构成 velocity 的 3 个浮点数。至于pv[1]工作,说明你很幸运,被允许访问那段内存。
  • pv[1] 在数组结束后立即访问内存。这会导致所谓的未定义行为,这意味着发生的事情完全取决于编译器和/或操作系统要做什么。在你的情况下,你很幸运,但你的程序也可能崩溃了。
【解决方案2】:

您的代码是正确的,但是您使用的语法有点奇怪。运算符[n] 表示:获取指针的地址(在您的情况下为pv 中的值),将其递增n,然后取消引用。由于您没有增加地址(n = 0),因此您可以取消引用它。您可以使用*pv 或简单地使用pv-&gt; 来执行此操作。当您分配了多个结构并希望将地址设置为这些结构之一时,您只需要[] 运算符。 pv[3] 将与 *(pv+3) 相同。但是如果要将指针用作数组,则首先必须分配更多空间:

malloc(sizeof(velocity) * 4)

【讨论】:

  • 感谢您接受我的回答。我发现了一个小错误:当我们想让pv[3] 有效时,它应该是malloc(... * 4)(因为就像任何数组一样,它从0 到3,总共有4 个元素)。
【解决方案3】:
  1. 是的,您以正确的方式使用了变量。

  2. 在您的代码中,您只为变量的一个实例分配了内存。所以,如果你写pv[0].Vxpv-&gt;Vx 也是一样的。如果要为n 个实例分配内存,可以使用pv[k].Vx,其中0&lt;=k&lt;=n-1

旁注:请do not castmalloc()的返回值。

【讨论】:

    猜你喜欢
    • 2010-09-17
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多