从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
从堆中分配内存,以便array
在point
框架之外。 解决方案应该是这样的,
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()中分配的,因此一旦函数退出就会被删除。 因此,对返回指针的引用会导致分段错误。