从函数c返回多个值
我来自c#,这给我带来的问题比我想象的要多。我还没有看到一个直接的解决办法。我是C语言的新手,只是在玩它,我尝试过的各种实现,从使用结构到传递指针,都无法完成任务。(本地值不变)。有人能给我举个简单的例子吗 这是我的代码示例从函数c返回多个值,c,C,我来自c#,这给我带来的问题比我想象的要多。我还没有看到一个直接的解决办法。我是C语言的新手,只是在玩它,我尝试过的各种实现,从使用结构到传递指针,都无法完成任务。(本地值不变)。有人能给我举个简单的例子吗 这是我的代码示例 #include <stdio.h> //alter values based on input int * doStuff(int a, int b){ int input; int arr[2] scanf("%d", &opti
#include <stdio.h>
//alter values based on input
int * doStuff(int a, int b){
int input;
int arr[2]
scanf("%d", &option);
switch(option);
case 1:
arr[0] = a-2;
arr[1] = b;
return arr;
break;
case 2:
arr[0] = a;
arr[1] = b-2;
return arr;
break;
default:
return a, b;
}
main(){
int a = 20;
int b = 20;
int returnedObject[2];
//what i need is like in c# how I can do this
returnedObject = doStuff(a, b);
a = returnedObject[0];
b= returnedObject[1];
}
#包括
//根据输入改变值
int*DOSTUF(int a,int b){
int输入;
int arr[2]
scanf(“%d”,选项(&O);
开关(选件);
案例1:
arr[0]=a-2;
arr[1]=b;
返回arr;
打破
案例2:
arr[0]=a;
arr[1]=b-2;
返回arr;
打破
违约:
返回a、b;
}
main(){
INTA=20;
int b=20;
int返回对象[2];
//我需要的是c#我怎么能做到这一点
returnedObject=doStuff(a,b);
a=返回的对象[0];
b=返回的对象[1];
}
我需要传递值,修改它们,返回它们,并设置局部变量。我完全不懂一些更复杂的例子。从c#指针、数组开始,它们的工作原理让我不知所措,而且它并不像我想象的那么简单 将返回类型设置为
int*
int *res;
res = doStuff(a, b);
a = res[0];
b = res[1];
创建一个局部变量int*result=malloc(sizeof(int)*2)编码>并将a
和b
或任何需要返回的内容放入结果中
调用函数时,将结果分配给int*
int *res;
res = doStuff(a, b);
a = res[0];
b = res[1];
malloc
为堆上的result
分配空间。它的输入是您需要的字节数
2int
s,每个int
->8个字节==2*sizeof(int)
问题是,每次调用函数时,都会不断分配越来越多的空间。C不会为您执行垃圾收集,因此当您使用完int*res
,您应该通过调用free(res)
来释放该空间
更多详细信息:
在C#中,您将初始化如下数组:int[]result=new result[2]代码>
您是否曾经尝试过打印这样的数组Console.WriteLine(myarray)代码>。它不起作用,是吗?C#我相信打印的东西类似于System.Int32[]
。如果您在Java中这样做(System.out.println(myarray);
),它会打印一些奇怪的数字
这个数字实际上是数组的地址
当您引用数组myarray
时,实际上是在引用数组的地址。当您执行类似于myarray[1]
的操作时,您将获得myarray
的地址,并将其添加到1*sizeof(int)
中并获取该值
在C语言中,可以用典型的方式定义数组:intarr[2]代码>为2整数分配空间
或者,您可以这样做:int*arr定义指针(或地址)的代码>。但是,您需要告诉它为整数分配空间。就像现在一样,arr
并没有真正指向任何东西。通过调用malloc
:arr=malloc(2*sizeof(int))来分配空间
为2个整数动态分配空间
现在你可以把东西放进你的数组了<代码>arr[0]=1
[]
正在有效地执行指针算法
arr[1] is the same as *(arr + 1)
arr+1
正在获取数组的地址并向其中添加1。C看到您正在添加一个int*
,因此它将1解释为1 int(4字节)。*
运算符取消对地址的引用,这意味着它跟随指针并获取存储在该地址的值
如果打印arr
给您0x1000
,arr+1
给您0x1004
,*
将返回存储在0x1004
的整数
打开以返回函数中的数组
在C语言中,不能像C#(int[]函数(…)
)那样返回数组,但可以返回指针(int*函数(…)
),可以像数组一样使用指针(参见上面的示例)
您希望使用malloc
的原因是malloc
在堆上分配空间,因此您可以在函数返回后使用该数组。如果您定义了一个数组,如intarr[2]代码>,将在堆栈上分配空间,并且在函数返回后数组将不会持久
也许你应该看看教程来了解更多关于指针的知识。我认为我的答案太长,与问题不完全相关。将返回类型设置为int*
int *res;
res = doStuff(a, b);
a = res[0];
b = res[1];
创建一个局部变量int*result=malloc(sizeof(int)*2)编码>并将a
和b
或任何需要返回的内容放入结果中
调用函数时,将结果分配给int*
int *res;
res = doStuff(a, b);
a = res[0];
b = res[1];
malloc
为堆上的result
分配空间。它的输入是您需要的字节数
2int
s,每个int
->8个字节==2*sizeof(int)
问题是,每次调用函数时,都会不断分配越来越多的空间。C不会为您执行垃圾收集,因此当您使用完int*res
,您应该通过调用free(res)
来释放该空间
更多详细信息:
在C#中,您将初始化如下数组:int[]result=new result[2]代码>
您是否曾经尝试过打印这样的数组Console.WriteLine(myarray)代码>。它不起作用,是吗?C#我相信打印的东西类似于System.Int32[]
。如果您在Java中这样做(System.out.println(myarray);
),它会打印一些奇怪的数字
这个数字实际上是数组的地址
当您引用数组myarray
时,实际上是引用
struct result { int x, int y };
struct result doStuff( int a, int b )
{
struct result ret = {a, b}; // initialize struct with inputs
...
case 1:
ret.x = a-2;
break; // y remains unchanged
case 2:
ret.y = b-2;
break; // x remains unchanged
...
return ret;
}
struct result stuff;
stuff = doStuff( a, b );
void doStuff( int *a, int *b )
{
...
case 1:
*a = *a - 2;
break;
case 2:
*b = *b - 2;
break;
}
doStuff( &a, &b );
void doStuff( int a, int b, int *result )
{
result[0] = a;
result[1] = b;
...
case 1:
result[0] = a - 2;
break;
case 2:
result[1] = b - 2;
break;
...
}
int results[2];
int a;
int b;
...
doStuff( a, b, results );