1

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

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

我为类似字符串分配了内存

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

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

我想一旦我调用 append_char() ,内存分配就会改变,这导致我无法掌握它。

编辑:这是使用 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;
}
4

3 回答 3

3
  1. malloc()不要在 C中转换返回值
  2. read_string确保在尝试追加之前初始化为空字符串,方法是设置read_string[0] = '\0';.
  3. 确保跟踪当前长度,这样就不会尝试构建不适合缓冲区的字符串。分配 500 个字符意味着最大字符串长度为 499 个字符。

不确定当你这样做时你期望会发生什么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 “没有工作”。

于 2012-09-17T09:46:11.587 回答
1

不,内存分配不会以任何方式更改append_char。它所做的只是更改分配的内容——通过将 nul 终止符移动一个字节,您现在关心的 500 个字节中的内容比以前多一个。

如果字符串的长度超过 500 个字节(包括终止符),那么您有未定义的行为。如果你调用strlen的东西不是以 nul 结尾的 string,例如,如果你直接从 向它传递一个指向未初始化内存的指针malloc,那么你有未定义的行为。

未定义的行为是不好的[*]:请随意阅读它,但“X 有未定义的行为”实际上是一种说“你不能做 X”的方式。

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

于 2012-09-17T09:41:32.397 回答
0

你有没有初始化过字符串?*read_string=0分配后试试。或使用calloc. 另外,您的字符串是否超出了分配的内存?

于 2012-09-17T09:41:03.697 回答