从C中的函数返回数组:分段错误

我试图使用头文件实现一个简单的程序,其中头文件中的函数接受一个int数组并返回一个int数组。

header.h

int* point(int a[]); 

header.c

 #include #include "header.h" int* point(int a[]) { printf("In the point function\n"); int array[4],i; for(int i=0;i<4;i++) { printf("%dth Iteration\n",i); array[i]=a[i]; } return array; } 

test.c的

 #include #include "header.h" void main() { int *array,i; int a[]={1,2,3,4}; printf("calling point function\n"); array=point(a); printf("Back in the main function\n"); for(i=0;i<4;i++) { //SEGMENTATION FAULT HERE printf("%d\n",array[i]); } } 

我在test.c中的print循环中遇到了分段错误。

有人可以帮忙吗?

该问题与您在方法中返回的array变量的范围有关。 现在你要返回array ,一个在方法中定义的局部变量point 。 但是,一旦完成执行,函数框架内的所有局部变量(包括array都将从主存储器中丢弃。 所以即使你仍然从point获得一个内存地址,也无法确定该内存地址的内容。 因此,在打印出其元素时将array视为int数组将导致分段错误。

我建议解决这个问题的方法是使用malloc从堆中分配内存,以便arraypoint框架之外。 解决方案应该是这样的,

 int* point(int a[]) { printf("In the point function\n"); int *array = (int *) malloc(4 * sizeof(int)); //dynamically allocate memory for 4 integers int i; for(i=0;i<4;i++) { printf("%dth Iteration\n",i); array[i]=a[i]; } return array; } 

您无法从函数返回数组。 当point()返回时,此函数中的本地数组超出范围。 此数组在堆栈上创建,并在函数完成返回后被销毁。 与之关联的所有内存都将被丢弃,返回的指针指向堆栈上不再存在的位置。 您需要在堆上分配一个指针,然后返回它。 这允许在您的程序中共享array

代替:

 int array[4]; 

你需要使用malloc()动态分配一个指针:

 int *array = malloc(4 * sizeof(*array)); /* or sizeof(int) */ if (array == NULL) { /* handle exit */ } 

malloc()在堆上分配请求的内存,并返回一个void*指针。

注意: malloc()在不成功时可以返回NULL ,因此需要始终检查它。 您还需要free()以前由malloc()分配的任何内存。 您也不需要转换malloc()的返回值 。

另一件需要指出的是在整个程序中使用幻数4 。 这应该使用sizeof(a)/sizeof(a[0])

您可以在main()中将其声明为size_t变量:

 size_t n = sizeof(a)/sizeof(a[0]); 

或者您可以使用宏:

 #define ARRAYSIZE(arr) (sizeof(arr) / sizeof(arr[0])) 

每次你想要数组的大小时,只需调用ARRAYSIZE(a)

您可以将array []定义为全局变量,也可以使用malloc()为上面的注释中提到的动态分配内存。 由于array []是在函数point()中分配的,因此一旦函数退出就会被删除。 因此,对返回指针的引用会导致分段错误。