【问题标题】:C Programming - Use of strcat() causing errors in valgrindC 编程 - 使用 strcat() 导致 valgrind 错误
【发布时间】:2014-11-03 20:20:33
【问题描述】:

我有一个读取文件的函数(来自标准输入),读取前 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)

谢谢!

【问题讨论】:

  • 什么是temp_sn?这真的是你的实际代码吗?
  • 当您使用它时,sizeof(char) 根据定义为 1,因此您可以忽略它。

标签: c malloc concatenation strcat


【解决方案1】:

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

有两种不同的方法可以修复它。两者都可以:

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

  • 使用calloc而不是malloc进行分配

【讨论】:

    【解决方案2】:

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

    原因是strcat 在复制内容之前会搜索附加数据的位置。但是在调用strcat的时候,temp_fd的内容是未初始化的,导致了这个问题。

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

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

    【讨论】:

    • LINESIZE*3 建议 temp_fd 应该在每次循环中累积内容。
    • @aschepler 你是对的,看起来 OP 确实想通过连接前三行来构建一个字符串。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多