繁体   English   中英

循环中的malloc()/ free()

[英]malloc()/free() in a loop

我有一个课,其中有一个文本文件bikes.txt 内容是自行车的属性,如下所示:

bike_id=16415
bike_station_id=455
bike_status=free

bike_id=6541
bike_station_id=1
bike_status=reserved

bike_id=5
bike_station_id=6451
bike_status=reserved

现在,我正在尝试读取所有bike_id ,并且我有一个问题:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* getAttribute(const char* attr, const char* line);

int main(int argc, char** argv)
{
    FILE* file = fopen("bikes.txt", "r");
    if (file != NULL)
    {
        char line[256];
        while (fgets(line, sizeof(line), file))
        {
            if (strstr(line, "bike_id=") != NULL)
            {
                char* bikeIdText = getAttribute("bike_id", line);
                printf("\"%s\"", bikeIdText);
                //free(bikeIdText);
                //bikeIdText = NULL;
            }
        }
    }
}

char* getAttribute(const char* attr, const char* line)
{
    int lineLength = strlen(line);
    int attrLength = strlen(attr);
    // +1 because of "="
    char* attrText = malloc(lineLength - attrLength + 1);
    // +2 because of "=" and NEWLINE
    memcpy(attrText, line + attrLength + 1, lineLength - (attrLength + 2));
    return attrText;
}

上面的代码有效。 输出为:

"16415""6541""5"

问题是-如果我是对的getAttribute()函数将分配越来越多的不会释放的内存。 但是,如果我取消注释free(bikeIdText); bikeIdText = NULL; main() ,输出显示使用相同的内存位置,因为较长的值不会被较短的值覆盖。 在这种情况下的输出:

"16415""65415""55415"

我该如何解决这个问题?

字符串的最后一个字符未设置为'\\ 0',因此,“%s”打印的内容超出其应有的范围(%s在\\ 0字节处停止输出)。

尝试多分配一个字节的char* attrText = malloc(lineLength - attrLength + 2)并在返回之前设置attrText[lineLength - attrLength + 1] = '\\0'

这个

  char* attrText = malloc(lineLength - attrLength + 1);

应该

  char * attrText = malloc(lineLength - (attrLength + 1));
  attrText[lineLength - (attrLength + 1) - 1] = '\0' ;

或同等学历

  char * attrText = malloc(lineLength - attrLength - 1);
  attrText[lineLength - attrLength - 2] = '\0' ;

这假定line一个附加字符结尾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM