附加字符后无法释放已分配的字符串内存

时间:2012-09-17 09:38:58

标签: c

我正在尝试将一个字符附加到一个字符串...这很好用但不幸的是我之后无法释放字符串的mem会导致字符串变得越来越长....因为它每次都读取一个文件linie将添加到字符串中,显然不应该发生

char* append_char(char* string, char character)
{
        int length = strlen(string);
        string[length] = character;
        string[length+1] = '\0';
        return string;
}

我为像

这样的字符串分配了mem
char *read_string = (char *)malloc(sizeof(char)*500);

调用函数append_char(read_string,buffer[0]);并在整个字符串构建free(read_string);

后释放它

我认为一旦我调用append_char(),mem分配就会被改变,这导致我无法掌握它。

编辑: 这是使用append_char()

的函数
char *read_log_file_row(char *result,int t)
{
filepath ="//home/,,,,,/mmm.txt";
int max = sizeof(char)*2;
char buffer[max];
char *return_fgets;

char *read_string = malloc(sizeof(char)*500);

file_pointer = fopen(filepath,"r");

if(file_pointer == NULL)
{
    printf("Didn't work....");
    return NULL;
}   

int i = 0;

while(i<=t)
{
  while(return_fgets = (fgets(buffer, max, file_pointer)))
  {
    if(buffer[0] == '\n') 
    {
       ++i;
       break;   
    }   

        if(i==t)
    {
      append_char(read_string,buffer[0]);
     }      
   }

   if(return_fgets == NULL)
   {
      free(read_string);
      return NULL;                              
/*              return "\0";*/
        }
       if(buffer[0] != '\n') 
        append_char(read_string,buffer[0]);

   }    
   fclose(file_pointer);
    strcpy(result,read_string); 
    free(read_string);
   return result;
}

3 个答案:

答案 0 :(得分:3)

  1. Dont cast the return value of malloc() in C
  2. 通过设置read_string,确保在尝试追加空字符串之前将read_string[0] = '\0';初始化为空字符串。
  3. 确保跟踪当前长度,因此不要尝试构建不适合缓冲区的字符串。分配500个字符表示最大字符串长度为499个字符。
  4. 当您执行free(read_string)时,不确定您预期会发生什么。听起来(从你的评论到@Steve Jessop的回答)你做了这样的事情:

    char *read_string = malloc(500);
    read_string[0] = '\0';  /* Let's assume you do this. */
    append_char(read_string, 'a'); /* Or whatever, many of these. */
    free(read_string);
    print("%c\n", *read_string); /* This invokes UNDEFINED BEHAVIOR. */
    

    可能打印a,但这证明没有,因为这样做(访问已经free()的内存:d)你的程序正在调用未定义的行为,这意味着任何事情都可能发生。你不能从中得出结论,因为“测试”无效。你不能释放内存然后访问它。如果你这样做,并得到一些“合理的”/“正确”的结果,你仍然不能说free():ing“不起作用”。

答案 1 :(得分:1)

不,append_char不会以任何方式更改内存分配。它所做的只是改变分配的内容 - 通过将nul终结符移动一个字节,你现在关心的是你的500字节中的一个以上的内容。

如果字符串超过500个字节(包括终结符),那么您有未定义的行为。如果您对不是以空字符结尾的字符串的内容调用strlen,例如,如果直接从malloc传递指向未初始化内存的指针,则表示您未定义行为。

未定义的行为很糟糕[*]:随时可以阅读它,但“X有未定义的行为”实际上是一种说“你不能做X”的方式。

[*]确切地说:不能保证不坏......

答案 2 :(得分:0)

你有没有初始化字符串?分配后尝试*read_string=0。或者使用calloc。还有,你的字符串增长超出分配的内存吗?