我正在编写一个包含3个函数main的程序:define structure(3个变量)和array(存储结果)function1:从用户获取数据 . 功能2:计算 .
我知道如何在main中使用结构,但在function1中存储值后,值不会传递给main函数 . 如何将值从函数1传递给main?
#include <stdio.h>
#define G 9.8
typedef struct
{
double weight;
double drag;
double time;
}USER_INPUT;
void getInput(USER_INPUT);
double calculatevelocities(USER_INPUT*);
void main(void)
{
USER_INPUT input;
getInput(input);
printf("%f %f %f\n", input.weight, input.drag, input.time);
}
void getInput(USER_INPUT input)
{
printf("Please enter weight, drag and time: ");
scanf("%lf %lf %lf", &input.weight, &input.drag, &input.time);
}
double calculatevelocities(USER_INPUT *data)
{
}
2 回答
您正在通过值将结构
input
传递给函数getInput()
,而不是通过引用 . 这意味着getInput()
正在处理input
的副本,而不是修改main()
正在使用的原始input
.试试这个
getInput()
实现:变量输入在main中声明,实际内存在此处保留 .
将 address 输入传递给函数getInput()
getInput()然后将值直接存储到该内存位置 . 在此示例中,此处编写代码的方式不需要从此函数传递值 .
for
calculatevelocites
如果您将输入的内存地址传递给它,那么您可以在编写该代码时使用->
,并且可以使其更容易编写和读取 .知道为
struct
传递变量的地址更好,因为你只需要该变量的4或8个字节,这是一个内存地址 . 如果你没有使用&
传递地址,那么接收该变量的任何函数都需要那么多内存 on the stack 来保存结构的全部内容 . 你的权重,拖动,时间的例子只有三个4字节整数=总共12个字节,但如果你的Attribute
结构有10,000个成员占用XXX个字节,那么你可以很容易地看到它如何迅速变得浪费和糟糕 . 默认的Linux安全设置通常会对stacksize施加8MB的限制,因此如果内核根本没有在没有错误消息的情况下杀死它,那么程序运行时可能会崩溃 . 不传递内存地址也会使程序变慢,因为Attribute结构变大,需要保留堆栈上的更多内存,然后在调用函数时释放,然后在函数退出时释放 .我更新了以下代码以获得
getInputTime_BAD
. 此函数在堆栈上为data
变量传递给它的方式分配内存,并且永远不会在main()中看到input
变量的原始分配的内存位置 . 当你执行printf时,这就是's really happening when you don't看到你输入的值出现在调用函数中 .以上输出: