Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';strcpy()有什么问题吗?(分段故障)_C_String - Fatal编程技术网

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

什么';strcpy()有什么问题吗?(分段故障),c,string,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 - mach

此代码中的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");
  ...............
  ...............

我遇到分段错误。

您没有为临时文件分配任何空间。这是一个。

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

尝试:

temp=(字符*)malloc(大小)

其中,
SIZE
是要为
temp

分配多少内存,实际上这里有三个分段错误:

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

第二个是
strcpy()
,您试图复制到一个不指向任何内容的指针。没有为
temp
静态或动态分配内存(指针引用本身除外)

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

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

第三个是
strtok()
,它将就地修改
temp
,这显然是无法做到的,因为从未分配过
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()的习惯,它更安全

这段代码让我很感兴趣:

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

   if(error_flag) exit(1);
}

如果文件指针为空,是否应该无条件退出?

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

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;

(另外,在真实代码中,您应该检查
fread
malloc
的结果)

为什么要对malloc进行注释?还要意识到
缓冲区
是不必要的。只需将
content
a
char*
。为什么使用一个字母的变量名?如果你花时间来评论他们的名字,为什么不花额外的2秒钟来拯救你自己和其他人未来的不幸并正确地说出他们的名字呢?谢谢大家。当然,但即使是“安全”版本也要求输入参数应该是实际值,而不是未初始化的垃圾。如果这里的strcpy有什么问题,那么整个C语言也有同样的问题。一旦第一个bug被修复,我们就可以担心
buffer
指向的数据是否实际包含NUL分隔符:-)是的。。那篇文章不完整。是这样的。错误标志=打印错误(100)//错误100:打开文件时出错!如果(错误标志)退出(1),则返回1@blacktooth,在打印好的错误并退出之前修改(可能)非原子错误标志有什么用?此外,仅当标志为高时,使
exit()
到达有什么用?如果
fopen()
返回空指针,为什么不退出呢?我想过用这种方式编写print\u error函数。int print_error(int error_type){switch(error_type){case 100:printf(“错误打开文件”);返回1;中断;case 101:printf(“无效输入!使用默认值零”);//某物返回0;break;………..这是个坏主意吗?
fread()
行也不正确,因为
内容也未初始化。@caf,我说的是指针
s
:)更新。
content = malloc(lsize);
fread(content,1,lsize,file_pointer);
temp = malloc(lsize + 1);
memcpy(temp, content, lsize);
temp[lsize] = 0;