2

我需要您的帮助,这应该很容易,但我不知道为什么它不起作用。我想从我知道它是一个 int 的 bin 中读取第一个数据。我正在使用以下代码部分,但出现分段错误:

int main(int argc, char **argv)
    {
        int *data;
        /*opening file*/
        FILE *ptr_myfile;
        ptr_myfile=fopen(myfile.bin","rb");
        if (!ptr_myfile)
        {
            printf("Unable to open file!\n");
            return 1;
        }
        /*input file opened*/
        printf("I will read the first 32-bit number\n");
        /*will read the first 32 bit number*/
        fread(&data,sizeof(int),1, ptr_myfile);
        printf("Data read is: %d\n",*data);     

        fclose(ptr_myfile);
        return 0;
    }

我也试过这样称呼它:

fread(data,sizeof(int),1, ptr_myfile);

它应该是指针的东西,但我看不到什么。

4

4 回答 4

9

改变:

  • int *data;int data;
  • printf("Data read is: %d\n",*data);printf("Data read is: %d\n",data);

您正在读int入指针,然后尝试取消引用指针(它的值作为指针毫无意义)。

于 2013-05-17T19:10:35.473 回答
3

您没有分配任何内存,data并且在第一个示例代码中您没有正确使用指针。这是一种可行的替代方法:

int data;

然后你会像这样使用它:

fread(&data,sizeof(int),1, ptr_myfile);

在您的原始代码中,您将在此处写入int指针:

fread(&data,sizeof(int),1, ptr_myfile) ;

然后这*data将取消引用一个无效的指针。在另一种情况下:

fread(data,sizeof(int),1, ptr_myfile);

您将使用一个没有分配内存的指针。

于 2013-05-17T19:11:09.597 回答
2

您正在传递未分配指针的地址。*从中删除data

int data;
...
fread(&data, sizeof(int), 1, ptr_myfile);
于 2013-05-17T19:11:14.457 回答
1

你在思考指针的问题。该函数fread()需要知道存储它读取的数据的地址,因此它被传递了一个指针。这并不意味着所使用的缓冲区fread应该是一个指针,只是fread需要一个指向该缓冲区的指针。

所以你的第一个错误是写int *data;你真正的意思int data;。您说要读取的数据元素是 an int,因此您只需声明 anint来保存它。

fread您通过将指针传递给实际分配的有效内存(即)正确调用来读取数据&data,避免了将未初始化指针传递给您之前声明的整数的不同初学者陷阱。

您的实际错误是由*dataprintf. 运算符获取一个*指针并取消引用它。换句话说,它假定指针指向某个东西,并检索该值。但是,当被取消引用的指针没有指向任何有效的东西时,你就有问题了。

这就是你幸运的地方。然后,您从文件中读取的值被*操作员视为内存中的地址,但碰巧是一个不属于您的进程可访问的内存的地址,这导致系统注意到并停止进程分段故障。结果,您立即了解到您的代码中存在错误。

如果你不走运,你从文件中读取的整数在被视为内存地址时可能是进程中已经存在的地址。您不会导致分段错误,并且您会对为什么会printf产生奇怪的答案感到困惑。

现在想象一下,如果您从不受信任的来源读取一个值并将其视为任意地址。攻击者可以使用该错误来了解您的程序。更糟糕的是,如果您已写入该指针所引用的内存,攻击者可能会改变您程序的行为。

最后一点,请注意读取和写入int(或任何其他数据类型)是安全且可接受的,只要该文件永远不会传输到不同的系统。并非所有系统都同意即使是最简单的定义,例如 int 占用的字节数(您确实使用 正确处理了它sizeof(int),但不是以允许与具有不同整数大小的系统交换文件的方式),甚至这些字节在内存中的顺序。正确解决这些问题是一个大课题。

于 2013-05-17T19:23:48.127 回答