我有一个二进制文件,其中包含数组中的N个数字。我想返回一个指向数组中元素的指针。
float *** reading(char* read_from) {
float x[n], *p;
p=x;
int i;
FILE *fh= fopen (read_from, "rb");
for (i=0;i<2*n*n;i++)
fread (&x[i], sizeof (x[i]), 1, fh);
fclose (fh);
return p;
}
int main()
{
float *var;
char *file="input.bin"; //this would be user input
var=reading(file);
printf("%f",*var);
}
如果我正在运行此功能,var
的内容会在我处理后被删除。我尝试切换到另一个指针(声明var1
)并且它无效。
编辑:函数头是必需的。它无法修改。
答案 0 :(得分:0)
问题在于,当您以这种方式创建局部变量*p
指向本地数组变量float x[n]
时,它会在堆栈上分配,因此一旦函数完成执行就不可用。也就是说,你调用曲调直到其范围结束。因此它会导致未定义的行为。
答案 1 :(得分:0)
一个问题是您返回局部变量的地址(具有自动存储持续时间),其生命周期在函数结束时结束。在生命周期结束后取消引用这样的指针是未定义的行为。如果n
是编译时常量,则快速修复将声明数组static
,使其生命周期一直到程序结束。否则,您必须将缓冲区传递给函数或让函数动态创建缓冲区。
此外,返回类型是指向float指针的指针,不能将其重新解释为指向float的指针。
您读入的值最多为2*n*n
,而您的数组的大小为n
。顺便说一句:你可以一步读取缓冲区(这里不需要循环)。
以下代码应解决这些问题:
float * reading(char* read_from) {
float *p = calloc(2*n*n, sizeof(float));
FILE *fh= fopen (read_from, "rb");
fread (p, 2*n*n, sizeof (float), fh);
fclose (fh);
return p;
}
请注意,一旦不再使用,调用者就有义务释放内存。