C,麻烦得到结构数组的大小

时间:2015-02-14 05:59:53

标签: c arrays struct sizeof

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

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

第I部分试图运行:

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使整个程序正常工作。为什么这种计算结构数组元素的方法不是?

3 个答案:

答案 0 :(得分:3)

sizeof(temp)

不会评估数组中的元素数。它将仅评估指针的大小。

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

build的签名更改为:

struct info* build(int* sizePtr);

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

然后,使用:

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

答案 1 :(得分:1)

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

唯一的解决方案是让build()函数也传回从文件中读取的元素数。一种方法是将int变量的地址发送到build(int *countp),然后build(int *countp)使用int ++*countp;将计数存储到此*countp = n;中读取每个元素或n其中build(...)是{{1}}维持计数的另一个变量。

答案 2 :(得分:1)

因为temp不是数组。这是一个指针。因此,在其上调用sizeof将返回指针的大小。

可能很难理解,但在C中,数组(真正的数组,而不是指针)最好被认为是值类型,它们很难传递值。数组不是指针,指针不是数组。

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

您从build()创建和返回的内容很可能是动态分配(通过malloc或朋友)内存缓冲区。在这种情况下,它始终不是真正的数组!它只是指向堆上一块内存的指针。这块内存不是一个值,并且无法使用sizeof来确定其大小。所以你别无选择,只能计算分配的struct的数量,并将这些信息传递给来电者。