从c中的函数返回两个指针
我知道您可以通过以下操作返回指向c中数组的第一个元素的指针:从c中的函数返回两个指针,c,pointers,C,Pointers,我知道您可以通过以下操作返回指向c中数组的第一个元素的指针: #include <stdlib.h> #include <stdio.h> int *my_func(void); int main(void) { int *a; int i; a = my_func(); for(i = 0; i < 3; i++) { printf("a[%d] = %d\n", i, a[i]); }
#include <stdlib.h>
#include <stdio.h>
int *my_func(void);
int main(void)
{
int *a;
int i;
a = my_func();
for(i = 0; i < 3; i++)
{
printf("a[%d] = %d\n", i, a[i]);
}
free(a);
return 0;
}
int *my_func(void)
{
int *array;
int i;
array = calloc(3, sizeof(int));
for(i = 0; i < 3; i++)
{
array[i] = i;
}
return array;
}
#包括
#包括
int*my_func(无效);
内部主(空)
{
int*a;
int i;
a=我的函数();
对于(i=0;i<3;i++)
{
printf(“a[%d]=%d\n”,i,a[i]);
}
免费(a);
返回0;
}
int*my_func(无效)
{
int*数组;
int i;
数组=calloc(3,sizeof(int));
对于(i=0;i<3;i++)
{
数组[i]=i;
}
返回数组;
}
但如果我想返回两个指针而不是一个指针,我尝试:
#include <stdlib.h>
#include <stdio.h>
int *my_func(int *);
int main(void)
{
int *a;
int *b;
int i;
a = my_func(b);
for(i = 0; i < 3; i++)
{
printf("a[%d] = %d\n", i, a[i]);
printf("b[%d] = %d\n", i, b[i]);
}
free(a);
free(b);
return 0;
}
int *my_func(int *array2)
{
int *array;
int i;
array = calloc(3, sizeof(int));
array2 = calloc(3, sizeof(int));
for(i = 0; i < 3; i++)
{
array[i] = i;
array2[i] = i;
}
return array;
}
#包括
#包括
int*my_func(int*);
内部主(空)
{
int*a;
int*b;
int i;
a=我的函数(b);
对于(i=0;i<3;i++)
{
printf(“a[%d]=%d\n”,i,a[i]);
printf(“b[%d]=%d\n”,i,b[i]);
}
免费(a);
免费(b);
返回0;
}
int*my_func(int*array2)
{
int*数组;
int i;
数组=calloc(3,sizeof(int));
array2=calloc(3,sizeof(int));
对于(i=0;i<3;i++)
{
数组[i]=i;
阵列2[i]=i;
}
返回数组;
}
但是这个seg在b的printf上出现故障。我通过valgrind运行了它,它说在printf中有一个无效的4号读数,这意味着我在用b指针做一些错误的事情。我只是想知道在c中“返回”第二个数组指针的最佳方法是什么?我这样问是因为我想这样做,而不是使用一个全局变量(我并不反对它们,因为它们有时很有用,如果可能的话,我宁愿不使用它们)。我在这个网站上看到的其他问题使用了静态分配的数组,但我还没有偶然发现一个使用动态分配的问题。提前谢谢 #包括
#include <stdlib.h>
#include <stdio.h>
int *my_func(int **);
int main(void)
{
int *a;
int *b;
int i;
b=(int *)malloc(sizeof(int));
a = my_func(&b);
for(i = 0; i < 3; i++)
{
printf("a[%d] = %d\n", i, a[i]);
printf("b[%d] = %d\n", i, b[i]);
}
free(a);
free(b);
return 0;
}
int *my_func(int **array2)
{
int *array;
int i;
array = calloc(3, sizeof(int));
*array2 =calloc(3,sizeof(int));
for(i = 0; i < 3; i++)
{
array[i] = i;
*((*array2)+i)=i;//or (*array2)[i]
}
return array;
}
#包括
int*my_func(int**);
内部主(空)
{
int*a;
int*b;
int i;
b=(int*)malloc(sizeof(int));
a=我的函数(&b);
对于(i=0;i<3;i++)
{
printf(“a[%d]=%d\n”,i,a[i]);
printf(“b[%d]=%d\n”,i,b[i]);
}
免费(a);
免费(b);
返回0;
}
int*my_func(int**array2)
{
int*数组;
int i;
数组=calloc(3,sizeof(int));
*array2=calloc(3,sizeof(int));
对于(i=0;i<3;i++)
{
数组[i]=i;
*((*array2)+i)=i;//或(*array2)[i]
}
返回数组;
}
通过引用传递指针。因为它的逻辑与相同,要操作整数块,需要向其传递指针。类似地,要操作指针,必须向其传递指针(即指针到指针)。我可以想出三种(半)简单的方法从C函数返回任意类型的多个项。这些方法描述如下。看起来有很多文本,但这个答案主要是代码,所以请继续阅读:
main()
中为int*
分配空间,然后将指向该空间的指针传递到my\u func
在main()
中:
my_func()
变成:
int *my_func(int **array2)
{
int *array;
int i;
array = calloc(3, sizeof(int));
*array2 = calloc(3, sizeof(int));
for(i = 0; i < 3; i++)
{
array[i] = i;
(*array2)[i] = i;
}
return array;
}
my_func()
然后变成:
int main(void)
{
int **ab;
int i;
ab = my_func(b);
for(i = 0; i < 3; i++)
{
printf("a[%d] = %d\n", i, ab[0][i]);
printf("b[%d] = %d\n", i, ab[1][i]);
}
free(ab[0]);
free(ab[1]);
free(ab);
return 0;
}
int **my_func(void)
{
int **arrays;
int i, j;
arrays = calloc(2, sizeof(int *));
arrays[0] = calloc(3, sizeof(int));
arrays[1] = calloc(3, sizeof(int));
for(j = 0; j < 2; j++)
{
for(i = 0; i < 3; i++)
{
arrays[j][i] = i;
}
}
return arrays;
}
然后,您可以将当前的功能重新表述为以下三个选项之一:
my_func
声明,尽管我相信任何合理的编译器都会在您忘记时提醒您
请记住,这仅仅是我一经发现就从脑海中抽出的三个选项。虽然它们很可能涵盖您可能很快遇到的任何用例的99%,但还有(可能有很多)其他选项。函数参数是它的局部变量。函数处理所提供参数值的副本 您可以按照以下方式想象您的函数定义及其调用
a = my_func(b);
int *my_func( /* int *array2 */ )
{
int *array2 = b;
//...
}
因此,函数内部局部变量array2
的任何更改都不会影响原始参数b
对于这样的函数定义,您必须通过引用传递参数,即函数应该像
int *my_func( int **array2 );
^^
有许多方法可以实现该功能。例如,您可以定义两个指针的结构
struct Pair
{
int *a;
int *b;
};
并将其用作函数的返回类型
struct Pair my_func( void );
另一种方法是向函数传递指向原始指针的指针数组
该函数可以如演示程序所示
#include <stdio.h>
#include <stdlib.h>
size_t multiple_alloc( int ** a[], size_t n, size_t m )
{
for ( size_t i = 0; i < n; i++ ) *a[i] = NULL;
size_t k = 0;
for ( ; k < n && ( *a[k] = malloc( m * sizeof( int ) ) ) != NULL; k++ )
{
for ( size_t i = 0; i < m; i++ ) ( *a[k] )[i] = i;
}
return k;
}
#define N 2
#define M 3
int main(void)
{
int *a;
int *b;
multiple_alloc( ( int ** [] ) { &a, &b }, N, M );
if ( a )
{
for ( size_t i = 0; i < M; i++ ) printf( "%d ", a[i] );
putchar( '\n' );
}
if ( b )
{
for ( size_t i = 0; i < M; i++ ) printf( "%d ", b[i] );
putchar( '\n' );
}
free( a );
free( b );
return 0;
}
int*array2
-->int**array2
,*array2=calloc(3,sizeof(int))代码>,(*array2)[i]=i代码>和a=my_func(&b)如果你用谷歌搜索问题标题,会有很多结果。如果你把“stackoverflow”也放进去,就更近了。@DavidBowling。让我知道我的修复是否可以接受。我认为这很好;只是想避免指针==数组语言的混淆。此外,无法从函数返回数组。@DavidBowling。我同意技术准确性很重要。我不确定复合文字是否应该在没有解释OP的情况下通过…@DavidBowling他可以问一个相应的问题。:)
a = my_func(b);
int *my_func( /* int *array2 */ )
{
int *array2 = b;
//...
}
int *my_func( int **array2 );
^^
struct Pair
{
int *a;
int *b;
};
struct Pair my_func( void );
#include <stdio.h>
#include <stdlib.h>
size_t multiple_alloc( int ** a[], size_t n, size_t m )
{
for ( size_t i = 0; i < n; i++ ) *a[i] = NULL;
size_t k = 0;
for ( ; k < n && ( *a[k] = malloc( m * sizeof( int ) ) ) != NULL; k++ )
{
for ( size_t i = 0; i < m; i++ ) ( *a[k] )[i] = i;
}
return k;
}
#define N 2
#define M 3
int main(void)
{
int *a;
int *b;
multiple_alloc( ( int ** [] ) { &a, &b }, N, M );
if ( a )
{
for ( size_t i = 0; i < M; i++ ) printf( "%d ", a[i] );
putchar( '\n' );
}
if ( b )
{
for ( size_t i = 0; i < M; i++ ) printf( "%d ", b[i] );
putchar( '\n' );
}
free( a );
free( b );
return 0;
}
0 1 2
0 1 2