从C:Segmentation Fault中的函数返回数组

时间:2017-01-30 01:53:00

标签: c

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

header.h

int* point(int a[]);

header.c

#include<stdio.h>
#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<stdio.h>
#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的打印循环中遇到了分段错误。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

此问题与您在方法中返回的array变量的范围有关。现在,您将返回array,即方法中定义的局部变量point。但是,一旦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;
}

答案 1 :(得分:2)

您无法从函数返回数组。当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()之前分配的任何内存don't need to cast return of malloc()。您还Trouble installing custom inf in Windows 10 Professional. Windows overrides it with OEM driver

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

您可以在size_t

中将其声明为main()变量
size_t n = sizeof(a)/sizeof(a[0]);

或者您可以使用宏:

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

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

答案 2 :(得分:0)

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