为什么在fclose上出现段错误?

时间:2009-07-28 09:35:50

标签: c file segmentation-fault

我显然遗漏了一些东西。有人可以解释为什么会发生这种情况吗?

#define RANDOM_DEVICE "/dev/random"
int create_shared_secret(char * secret,int size)
{
  FILE * file=NULL;
  int RetVal;

  file=fopen(RANDOM_DEVICE,"r");
  if(!file)
  {
    printf("Unable to open random device %s\n",RANDOM_DEVICE);
    exit(-1);
  }
  RetVal=fread(&secret,1,size,file);
  if(RetVal!=size)
  {
    printf("Problem getting seed value\n");
    exit(-1);
  }

  if(file) fclose(file);  //segfault right here
  return 0;
}

3 个答案:

答案 0 :(得分:9)

你正在粉碎堆栈,在读取'secret'变量时用borked覆盖文件变量。 '秘密'已经是一个指针,所以它不需要'&'操作

fread line应该是

RetVal=fread(secret,1,size,file);

你正在做的事情基本上是将一个新的指针值读入秘密(而不是秘密所指向的内存),并且阅读方式太多,溢出到你的其他变量中。如果你在这个函数中使用了秘密,那么它也会被分段(如果你运气不好,希望,或者在程序的其他部分造成随机损坏)。

HTH。

答案 1 :(得分:4)

我猜这个问题就在这里:

RetVal=fread(&secret,1,size,file);

你的意思是:

RetVal=fread(secret,1,size,file);

或者,secret指向的缓冲区长度不是size个字节。你有正确的分配吗?

答案 2 :(得分:3)

带有fread(&secret,...类型的秘密的

char*会覆盖secret的值,然后可能是file,而不是写入secret指向的值。