从函数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

我来自c#,这给我带来的问题比我想象的要多。我还没有看到一个直接的解决办法。我是C语言的新手,只是在玩它,我尝试过的各种实现,从使用结构到传递指针,都无法完成任务。(本地值不变)。有人能给我举个简单的例子吗

这是我的代码示例

#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
分配空间。它的输入是您需要的字节数

2
int
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
分配空间。它的输入是您需要的字节数

2
int
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 );