此代码中的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");
...............
...............
我收到了分段错误..
答案 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;
(另外,在实际代码中,您应该检查fread
和malloc
的结果。)
答案 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,你不应该无条件退出吗?