C语言中结构体与字符串传递至函数失败问题求助
结构体参数传递失败的解决方法
我有一段来自外部代码的预定义结构体,且不允许对其进行修改。现在需要在calculate_temperatures函数中实现温度计算逻辑,但尝试了多种参数传递方式均无法正常工作。
相关代码
struct temperature { float *data; int size; } temperatures; struct temperature get_temperature_Data() { temperatures.size = 0; temperatures.data = (float *)malloc(sizeof(float)); temperatures.data[temperatures.size++] = 25.9; temperatures.data[temperatures.size++] = 55.2; return temperatures; } void calculate_temperatures(temperatures, testmessage) { //test output for correct data printf("%s\n", testmessage); printf("test %d\n", temperatures.size); } int main() { int i; temperatures = get_temperature_Data(); calculate_temperatures(temperatures, "Testoutput"); }
我的两次尝试
void calculate_temperatures(temperatures, char *testmessage) { void calculate_temperatures(temperatures, char testmessage[]) {
问题分析与解决
你的核心问题是函数参数未指定结构体类型,C语言要求每个函数参数必须明确声明类型。你两次尝试都只给第二个参数添加了类型,第一个参数temperatures没有指定其为struct temperature类型,编译器无法识别该参数的类型,导致编译错误。
正确的函数写法
如果你只需要读取结构体数据(不需要修改原结构体),可以按值传递:
void calculate_temperatures(struct temperature temps, char *testmessage) { printf("%s\n", testmessage); printf("test %d\n", temps.size); // 示例:遍历温度数组 for (int i = 0; i < temps.size; i++) { printf("第%d个温度: %.1f\n", i+1, temps.data[i]); } // 在这里添加具体温度计算逻辑 }
如果需要修改原结构体(比如更新计算后的温度值),建议传指针(避免结构体拷贝开销,同时能直接修改原数据):
void calculate_temperatures(struct temperature *temps, char *testmessage) { printf("%s\n", testmessage); printf("test %d\n", temps->size); // 示例:将摄氏温度转换为华氏温度 for (int i = 0; i < temps->size; i++) { temps->data[i] = temps->data[i] * 1.8 + 32; printf("转换后第%d个温度: %.1f\n", i+1, temps->data[i]); } }
调用时需要传递结构体地址:
calculate_temperatures(&temperatures, "Testoutput");
额外注意点
你的get_temperature_Data函数存在内存越界问题:仅malloc了1个float的存储空间,却存入了2个浮点数,会触发未定义行为。可以修改为:
struct temperature get_temperature_Data() { temperatures.size = 0; // 分配能容纳2个float的空间 temperatures.data = (float *)malloc(sizeof(float) * 2); temperatures.data[temperatures.size++] = 25.9; temperatures.data[temperatures.size++] = 55.2; return temperatures; }
内容的提问来源于stack exchange,提问作者user19100872
相关产品推荐
相关产品推荐

