我试图获取结构数组中的元素数量,以便将其传递给另一个函数。的结构:
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使整个程序正常工作。为什么这种计算结构数组元素的方法不是?
答案 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
的数量,并将这些信息传递给来电者。