我正在尝试使用头文件实现一个简单的程序,其中头文件中的函数接受一个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
的打印循环中遇到了分段错误。
有人可以帮忙吗?
答案 0 :(得分:2)
此问题与您在方法中返回的array
变量的范围有关。现在,您将返回array
,即方法中定义的局部变量point
。但是,一旦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;
}
答案 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()中分配的,因此一旦函数退出就会被删除。因此,对返回指针的引用会导致分段错误。