C编程 - 使用strcat()导致valgrind中的错误

时间:2014-11-03 20:20:33

标签: c malloc concatenation strcat

我有一个函数读取文件(来自stdin),读取前3行并连接它们。

char line[LINESIZE];
char *temp_fd = malloc(sizeof(char)*LINESIZE*3);
char *temp_sm = malloc(sizeof(char)*LINESIZE);
char *temp_nm = malloc(sizeof(char)*LINESIZE);

char temp_pc[LINESIZE];

for(i=0;i<3;i++) {
    if (fgets(line, LINESIZE, file) != NULL) {
        strcat(temp_fd,line);

        if (i==0)
            strcpy(temp_sn, line);
        else if(i==1)
            strcpy(temp_nm, line);
        else if(i==2)
            strcpy(temp_pc,line);
    }
}

我在valgrind中遇到两个错误,据我所知,strcat是个问题。如何为我的指针正确分配内存? (LINESIZE是60 btw)

谢谢!

2 个答案:

答案 0 :(得分:3)

在使用之前,您没有做任何事情来清除缓冲区空间。

有两种不同的方法可以解决它。要么工作:

  • 在使用之前将空终止符字节写入缓冲区的头部(例如strcpy(temp_fd, "");

  • 使用calloc而不是malloc分配

答案 1 :(得分:2)

由于temp_fd未初始化,因此您应该在首次完成循环时使用strcpy而不是strcat。这将复制字符串,而不是尝试附加它。

原因是strcat在复制内容之前搜索附加数据的位置。但是,当您致电temp_fd时,strcat的内容未初始化,从而导致问题。

或者,您可以在分配后立即将'\0'放在temp_fd的初始位置,并在循环的所有迭代中调用strcat

char *temp_fd = malloc(sizeof(char)*LINESIZE*3);
temp_fd[0] = '\0';