指针中的值会自动删除

时间:2018-01-03 19:47:13

标签: c

我有一个二进制文件,其中包含数组中的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)并且它无效。

编辑:函数头是必需的。它无法修改。

2 个答案:

答案 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;
}

请注意,一旦不再使用,调用者就有义务释放内存。