【问题标题】:C, Trouble getting size of array of structsC,获取结构数组的大小时遇到​​问题
【发布时间】:2015-02-14 05:59:53
【问题描述】:

我正在尝试获取结构数组中的元素数量,以便将其传递给另一个函数。结构:

struct info{
    char string1[30];
    float float1;
    int int1;
    char string2[30];
};

我正在尝试运行的部分:

void function1(){
    struct info* temp = build();
    printf("flag: %lu %lu %lu\n", sizeof(temp), sizeof(temp[0]), sizeof(temp)/sizeof(temp[0]));
    sortFloat(temp, sizeof(temp)/sizeof(temp[0]), 1);
    free(temp);
}

build() 在从文件中读取数据后返回一个结构数组,其中每一行都是数组中的一个结构。我无法将数组的大小传递给 sortFloat()。打印行返回

flag: 8 72 0

当数据文件中只有两行时。将该参数硬编码为 2 可使整个程序正常工作。为什么这种计算结构体数组元素的方法不行?

【问题讨论】:

  • sizeof(temp) 会给你指针变量的大小而不是整个数组的大小。
  • build() 返回不是数组(所有内容),在 C 中,您不能从函数返回数组,它永远是指向数组第一个元素的指针。 C中的指针和数组是不一样的。

标签: c arrays struct sizeof


【解决方案1】:
sizeof(temp)

不会计算数组中元素的数量。它将只计算指针的大小。

如果需要数组的大小,可以这样做:

build的签名改为:

struct info* build(int* sizePtr);

确保在实现中正确设置了sizePtr

然后,调用它:

int size;
struct info* temp = build(&size);

【讨论】:

    【解决方案2】:

    您认为的数组更准确地说只是指向第一个元素的指针。 function1() 无法知道第一个元素后面有多少个元素。只有函数 build() 知道读取了多少元素以及动态分配了多少内存来存储这些元素。

    唯一的解决方案是让build() 函数也传回从文件中读取的元素数量。一种方法是将int 变量的地址发送到build(int *countp) 并让build(int *countp) 在读取每个元素时使用++*countp; 将计数存储到int 中,或者*countp = n; 其中@987654330 @ 是一个不同的变量,build(...) 在其中维护计数。

    【讨论】:

      【解决方案3】:

      因为temp 不是数组。它是一个指针。所以在它上面调用sizeof会返回指针的大小。

      这可能很难理解,但在 C 中,数组(real 数组,而不是指针)最好被视为 值类型,它们很难被传递价值。数组不是指针,指针也不是数组。

      sizeof 是一个运算符,用于确定一个所占用的内存大小。这就是为什么当应用于 array 时,它返回数组的大小,而当应用于指针时 - 只是指针的大小。

      您正在创建并从build() 返回的内容很可能是动态分配(通过malloc 或朋友)的内存缓冲区。在这种情况下,它从来就不是一个 real 数组!它只是指向堆上一块内存的指针。这块内存不是一个值,它的大小不能像这样使用sizeof 来确定。所以你别无选择,只能计算分配的structs 的数量并将该信息提供给调用者。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-25
        • 2011-07-28
        • 1970-01-01
        • 1970-01-01
        • 2013-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多