我正在尝试将一个字符附加到一个字符串...这很好用但不幸的是我之后无法释放字符串的mem会导致字符串变得越来越长....因为它每次都读取一个文件linie将添加到字符串中,显然不应该发生
char* append_char(char* string, char character)
{
int length = strlen(string);
string[length] = character;
string[length+1] = '\0';
return string;
}
我为像
这样的字符串分配了memchar *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;
}
答案 0 :(得分:3)
malloc()
in C。read_string
,确保在尝试追加空字符串之前将read_string[0] = '\0';
初始化为空字符串。当您执行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
。还有,你的字符串增长超出分配的内存吗?