在询问为什么我不能从malloc / calloc返回数组大小之前,我已经问了一个与此有关的问题(我收到了答案)。
我当前的问题是我定义了2个数组,并填写两个单独的源文件ship.c和rescue_assets.c。我试图在名为system_handler.c的文件中的方法中循环它们。
我遇到的麻烦是这个任务要求你不要将数组大小硬编码到代码中,所以我不知道如何将每个c文件中的数组大小链接到第3个c文件中的这个函数。
最终我想:
assign_mayday_to_ships(int SIZE_OF_ARRAY_FROM_FILE_1, int SIZE_OF_ARRAY_FROM_FILE_2){
for(int i=0; i < SIZE_OF_ARRAYFROM_FILE_1; i++){
for(int j = 0; < SIZE_OF_ARRAYFROM_FILE_2; j++{
//do something
}
}
如果它们在同一个文件中,我可以很容易地做到这一点,但我无法从两个不同的文件中调用该方法,因为它显然缺少所需的参数。
这是有问题的代码(香港专业教育学院只添加了所需的片段,包含所有标题,系统按预期的方式运行以获得数组大小):
system_handler.c
void assign_mayday_to_ships() {
mayday_call* mday_ptr;
ship* ship_ptr;
rescue_asset* assets_ptr;
mday_ptr = read_mayday_file();
ship_ptr = read_ship_locations();
assets_ptr = read_recuse_assets();
int i;
int result;
/* loop through ship locations to find the ship that called the mayday
When found assign the mayday call to the ship for use when sending help*/
for (i = 0; i < arr_size; i++) {
result = strncmp(mday_ptr->ais, (ship_ptr + i)->ais, COMPARE_LIMIT);
if (result == 0) {
mday_ptr->ship = (ship_ptr + i);
}
}
calc_distance_to_mayday(mday_ptr, assets_ptr);
}
rescue_asset.c:assets是我想要获得的数组。
rescue_asset* assets;
no_of_lines = count_lines(locof);
printf("number of lines = %d \n", no_of_lines);
assets = calloc(no_of_lines,sizeof (rescue_asset));
ship.c:ship是想要获得大小的数组。
ship* ships;
/* -1 because first line of file is not a ship location*/
no_of_lines = (count_lines(locof) - 1);
ships = calloc(no_of_lines, sizeof (ship));
使用实际数组而不是calloc等会更好吗?
谢谢, 克里斯。
答案 0 :(得分:1)
您必须将已分配的项目数作为参数传递给该函数。如果你不能这样做(比如你在被调用的函数中分配它们的情况)你可以通过将大小作为指针参数添加到执行分配的函数(通过引用传递)来返回它,或者返回包含指针和大小的结构。
首先,您可以执行类似
的操作size_t asset_size;
asset *assets_ptr = read_recuse_assets(&asset_size);
然后在read_recuse_assets
中将*asset_size
设置为正确的大小。
当然,您可以使用指针和大小执行相反的操作,并将指针传递给assets_ptr
作为参数并返回大小。
更完整的例子:
asset *read_recuse_assets(size_t *asset_size)
{
...
*asset_size = no_of_lines;
return assets;
}
如上所述打电话。
对于第二种选择,你可以有这样的结构:
struct asset_data
{
size_t size;
asset *assets;
};
然后返回此结构的实例(不是指针),填入字段。