gpt4 book ai didi

mysql - C - 将数组作为参数传递并更改大小和内容

转载 作者:太空宇宙 更新时间:2023-11-04 01:22:30 24 4
gpt4 key购买 nike

更新:我解决了我的问题(向下滚动)。


我正在编写一个小的 C 程序,我想执行以下操作:

该程序已连接到 mysql 数据库(运行良好),我想对数据库中的数据进行处理。每个查询大约有 20-25 行,我创建了自己的结构,它应该包含查询每一行的信息。

所以我的结构看起来像这样:

typedef struct {
int timestamp;
double rate;
char* market;
char* currency;
} Rate;

我想将一个空数组传递给一个函数,该函数应根据查询返回的行数计算数组的大小。例如。单个 SQL 查询返回 20 行,因此该数组应包含我的 Rate 结构的 20 个对象。

我想要这样的东西:

int main(int argc, char **argv)
{
Rate *rates = ?; // don't know how to initialize it
(void) do_something_with_rates(&rates);

// the size here should be ~20
printf("size of rates: %d", sizeof(rates)/sizeof(Rate));
}

函数 do_something_with_rates(Rate **rates) 应该是什么样子?


编辑:我按照 Alex 所说的那样做了,我让我的函数返回数组的大小作为 size_t 并将我的数组作为 Rate 传递给函数**费率

在函数中,您可以访问和更改值,例如 (*rates)[i].timestamp = 123

最佳答案

在 C 中,内存是动态或静态分配的。

int fifty_numbers[50] 之类的东西是静态分配的。无论如何大小都是 50 个整数,所以编译器知道数组有多大(以字节为单位)。 sizeof(fifty_numbers) 将在此处为您提供 200 个字节。

动态分配:int *bunch_of_numbers = malloc(sizeof(int) * varying_size)。如您所见,varying_size 不是常量,因此编译器无法在不执行程序的情况下计算出数组的大小。 sizeof(bunch_of_numbers) 在 32 位系统上为您提供 4 个字节,在 64 位系统上为您提供 8 个字节。唯一知道数组有多大的人就是程序员。在你的例子中,它是编写 do_something_with_rates() 的人,但你要么不返回它,要么采用大小参数来丢弃该信息。

目前还不清楚 do_something_with_rates() 是如何被准确声明的,但是像这样的东西:void do_something_with_rates(Rate **rates) 不会工作,因为函数不知道rates 有多大。我推荐这样的东西:void do_something_with_rates(size_t array_size, Rate **rates)。无论如何,按照您的要求,它离工作还有一段距离。可能的解决方案如下:

您需要返回新数组的大小:

size_t do_something_with_rates(size_t old_array_size, Rate **rates) {
Rate **new_rates;
*new_rates = malloc(sizeof(Rate) * n); // allocate n Rate objects

// carry out your operation on new_rates

// modifying rates
free(*rates); // releasing the memory taken up by the old array
*rates = *new_rates // make it point to the new array

return n; // returning the new size so that the caller knows
}

int main() {
Rate *rates = malloc(sizeof(Rate) * 20);
size_t new_size = do_something_with_rates(20, &rates);
// now new_size holds the size of the new array, which may or may not be 20

return 0;
}

或者传入一个size参数给函数设置:

void do_something_with_rates(size_t old_array_size, size_t *new_array_size, Rate **rates) {
Rate **new_rates;
*new_rates = malloc(sizeof(Rate) * n); // allocate n Rate objects
*new_array_size = n; // setting the new size so that the caller knows

// carry out your operation on new_rates

// modifying rates
free(*rates); // releasing the memory taken up by the old array
*rates = *new_rates // make it point to the new array
}

int main() {
Rate *rates = malloc(sizeof(Rate) * 20);
size_t new_size;
do_something_with_rates(20, &new_size, &rates);
// now new_size holds the size of the new array, which may or may not be 20

return 0;
}

为什么我需要将旧尺寸作为参数传递?

void do_something_with_rates(Rate **rates) {
// You don't know what n is. How would you
// know how many rate objects the caller wants
// you to process for any given call to this?
for (size_t i = 0; i < n; ++i)
// carry out your operation on new_rates
}

当你有一个尺寸参数时,一切都会改变:

void do_something_with_rates(size_t size, Rate **rates) {
for (size_t i = 0; i < size; ++i) // Now you know when to stop
// carry out your operation on new_rates
}

这是您程序的一个非常根本的缺陷。

我还想要更改数组内容的函数:

size_t do_something_with_rates(size_t old_array_size, Rate **rates) {
Rate **new_rates;
*new_rates = malloc(sizeof(Rate) * n); // allocate n Rate objects

// carry out some operation on new_rates
Rate *array = *new_rates;
for (size_t i = 0; i < n; ++i) {
array[i]->timestamp = time();
// you can see the pattern
}

return n; // returning the new size so that the caller knows
}

关于mysql - C - 将数组作为参数传递并更改大小和内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38547513/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com