从函数返回数组/指针

我正在尝试创建一个从字符串派生的新整数数组。 例如 :

char x[] = "12334 23845 32084"; int y[] = { 12334, 23845, 32084 }; 

我无法理解如何从函数中返回一个数组(我理解不可能)。

我最初尝试过:

 /* Convert string of integers into int array. */ int * splitString( char string[], int n ) { int newArray[n]; // CODE return ( newArray ); } int main( void ) { int x[n] = splitString( string, n ); return ( 0 ); } 

我后来才知道你不能这样做。

指针如何在函数方面起作用?

谢谢。

通常,您需要调用者传入结果数组。

 void splitString( const char string[], int result[], int n) { //.... } 

这是有利的,因为调用者可以在任何他们想要的地方分配该存储器。

问题是你正在返回指向堆栈上某些东西的指针。 您需要在堆上创建数组,然后在完成后释放它:

 int * splitString( char string[], int n ) { int *newArray = malloc(sizeof(int) * n); // CODE return ( newArray ); } int main( void ) { int *x = splitString( string, n ); // use it free(x); return ( 0 ); } 
 int * splitString( char string[], int n ) { int newArray[n]; return ( newArray ); } 

这真是太糟了! 当函数返回时,函数本地的数组newArray被销毁。 你会被一个悬空指针所遗忘,使用它会调用未定义的行为。

您无法从函数返回数组。 你能做的最好的是

 int * splitString( char string[], int n ) { int *newArray = malloc(n*sizeof(int)); // the array gets allocated on the heap rather than on the stack(1) // Code return ( newArray ); } 

不要忘记释放分配的内存。

(1)请注意,标准不使用/定义术语堆栈或堆本身。

而不是返回带有return (newArray)的数组,而是返回指向 newArray的第一个元素的指针

问题是你以错误的方式分配数组。 如果使用int newArray[n]实例化它,则会在当前堆栈帧上分配内存。 一旦函数返回,该内存将被释放,并且数组中的任何内容都将是垃圾。 相反,请执行以下操作:

 int *newArray = malloc(n * sizeof(int)); // etc. return newArray 

通过使用malloc ,您可以在堆上分配内存,它将在当前堆栈帧结束后继续存在。 只要记得在完成后在程序中的某个地方free(newArray)

您可以将数组包装在结构中,然后返回结构的实例。 我提到这一点是为了完整,它并不是你想要做的事情,因为它很丑陋而且有更好的选择。

 #include  struct retval { int a[10]; }; struct retval test() { struct retval v = {{1, 5, 6}}; return v; } int main() { struct retval data = test(); printf("%d %d\n", data.a[1], data.a[2]); } 

我会这样做

 /* Convert string of integers into int array. */ void splitString(char string[], int *out_arr, int n ) { // code that fills each cell of out_arr } int main( void ) { int x[n]; splitString( string,(int *)x, n ); return ( 0 ); } 

当然有可能。 这是我喜欢的方式: int func(int** results)

函数返回results的元素数。 results是一个指向int数组的指针。