strcpy()有什么问题? (分段故障)

时间:2010-05-19 19:51:53

标签: c string

此代码中的strcpy()有什么问题?

void process_filedata(char *filename)
{
  void* content;
  const char * buffer;
  char * temp;
  char * row;
  char * col;
  int lsize,buflen,tmp,num_scan; //num_scan - number of characters scanned
  int m=0,p=0,d=0,j=0; //m - machine, p - phase, d- delimiter, j - job

  FILE *file_pointer = fopen("machinetimesnew.csv","r");

  if(file_pointer == NULL)
  {
   error_flag =  print_error("Error opening file");

   if(error_flag) exit(1);
  }
  fseek(file_pointer, 0 ,SEEK_END);
  lsize = ftell(file_pointer);
  buflen = lsize;
  rewind(file_pointer);
 // content = (char*) malloc(sizeof(char)*lsize);
  fread(content,1,lsize,file_pointer);
  buffer = (const char*) content;
  strcpy(temp,buffer);
  row = strtok(temp,"\n");
  ...............
  ...............

我收到了分段错误..

7 个答案:

答案 0 :(得分:13)

你没有为临时分配任何空间。这是一个wild pointer

答案 1 :(得分:9)

这里实际上有三个分段错误:

fread(content,1,lsize,file_pointer);
strcpy(temp,buffer);
row = strtok(temp,"\n");

第一个是fread(),它试图写入内存,就你的进程而言还不存在。

第二个是strcpy(),(在第一个上解释)你试图复制到一个指向任何东西的指针。没有为temp静态或动态地分配内存(指针引用本身除外)。

通过将temp更改为这样(静态分配)来解决此问题:

char temp[1024];

或者使用malloc()为它动态分配内存(以及其他指针,因此它们实际指向某些内容),同样适用于content。如果您在编译时知道所需的缓冲区大小,请使用静态分配。如果没有,请使用malloc()。 “知道”是另一个问题的主题。

第三个是strtok(),它将修改temp en situ (就地),这显然不能做,因为temp从未分配过。无论如何,temp完成strtok()后,不要指望它是相同的。通过变量的名称,我假设你知道。

此外,初始化指针与为其分配内存相同:

char *temp = NULL; // temp is initialized
char *temp = (char *) malloc(size); // temp is allocated if malloc returns agreeably, cast return to not break c++

最后,请养成使用strncpy()而不是strcpy()的习惯,它更加安全。

答案 2 :(得分:8)

strcpy没什么问题。您尚未初始化temp

答案 3 :(得分:3)

还有一个错误。 fread不会在缓冲区末尾添加一个空字符。那是因为它只处理字节数组,而不是以空字符串结尾的字符串。所以你需要做这样的事情:

content = malloc(lsize + 1);
fread(content,1,lsize,file_pointer);
content[lsize] = 0;
temp = malloc(lsize + 1);
strcpy(temp, content);

或者这个:

content = malloc(lsize);
fread(content,1,lsize,file_pointer);
temp = malloc(lsize + 1);
memcpy(temp, content, lsize);
temp[lsize] = 0;

(另外,在实际代码中,您应该检查freadmalloc的结果。)

答案 4 :(得分:2)

你没有为temp

分配内存

答案 5 :(得分:1)

char * temp尚未初始化,因此您没有为其分配任何内存。

尝试:

temp = (char *)malloc(SIZE);

其中SIZE是您要为temp

分配的大量内存

答案 6 :(得分:1)

这段代码引起了我的兴趣:

if(file_pointer == NULL)
{
   error_flag =  print_error("Error opening file");

   if(error_flag) exit(1);
}

如果file_pointer为NULL,你不应该无条件退出吗?