忍受我。我在8年内没有用c编码,我完全不知道为什么我的字符串操作不起作用。我正在写一个永远循环的程序。在循环中,我初始化两个char指针,每个指针都传递给一个向char指针(数组)添加文本的函数。函数完成后,我打印char指针并释放两个char指针。但是,程序在7次迭代后死亡,并显示以下错误消息
*检测到glibc * ./test:双重免费或损坏(fasttop):0x0804a168 ***
#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include string.h
#include stdio.h
#include stdlib.h
#include errno.h
#include time.h
char *SEPERATOR = "|";
void getEvent (char* results);
void getTimeStamp(char* timeStamp, int timeStampSize);
void stringAppend(char* str1, char* str2);
int main (int argc, char *argv[])
{
int i = 0;
while(1)
{
i++;
printf("%i", i);
char* events= realloc(NULL, 1);
events[0] = '\0';
getEvent(events);
char* timestamp= realloc(NULL, 20);
timestamp[0] = '\0';
getTimeStamp(timestamp, 20);
printf("%s", events);
printf("timestamp: %s\n", timestamp);
free(events);
free(timestamp);
}
}
void getEvent (char* results)
{
stringAppend(results, "a111111111111");
stringAppend(results, "b2222222222222");
}
void getTimeStamp(char* timeStamp, int timeStampSize)
{
struct tm *ptr;
time_t lt;
lt = time(NULL);
ptr = localtime(<);
int r = strftime(timeStamp, timeStampSize, "%Y-%m-%d %H:%M:%S", ptr);
}
void stringAppend(char* str1, char* str2)
{
int arrayLength = strlen(str1) + strlen(str2) + strlen(SEPERATOR) + 1;
printf("--%i--",arrayLength);
str1 = realloc(str1, arrayLength);
if (str1 != NULL)
{
strcat(str1, SEPERATOR);
strcat(str1, str2);
}
else
{
printf("UNABLE TO ALLOCATE MEMORY\n");
}
}
答案 0 :(得分:7)
您正在重新分配str1
,但没有将值传递出您的函数,因此潜在更改的指针会被泄露,并且已由realloc
释放的旧值将再次被您释放。这会导致“双重免费”警告。
答案 1 :(得分:4)
问题是当stringAppend重新分配指针时,只有stringAppend知道这个事实。您需要修改stringAppend以获取指针指针(char **),以便更新原始指针。
答案 2 :(得分:4)
stringAppend中的这一行:
str1 = realloc(str1, arrayLength);
更改stringAppend中局部变量的值。这个名为str1的局部变量现在指向重新分配的内存或NULL。
同时,getEvent中的局部变量保留了之前的值,现在通常指向释放的内存。
答案 3 :(得分:1)
所有评论非常有帮助。当然,完全可以理解为什么错误发生了。我最终通过进行以下更改来解决它。
对于getEvent和stringAppend,我返回char指针。
e.g。
char* stringAppend(char* str1, char* str2)
{
int arrayLength = strlen(str1) + strlen(str2) + strlen(SEPERATOR) + 1;
printf("--%i--",arrayLength);
str1 = realloc(str1, arrayLength);
if (str1 != NULL)
{
strcat(str1, SEPERATOR);
strcat(str1, str2);
}
else
{
printf("UNABLE TO ALLOCATE MEMORY\n");
}
return str1;
}
答案 4 :(得分:0)
这不是你问题的答案(你不需要一个,因为已经指出了错误),但我对你的代码有其他一些评论:
char* events= realloc(NULL, 1);
events[0] = '\0';
您不测试realloc
是否已成功分配内存。
char* timestamp= realloc(NULL, 20);
timestamp[0] = '\0';
这里的问题相同。在这种情况下,您根本不需要realloc
。由于这是一个固定大小的缓冲区,您可以使用:
char timestamp[20] = "";
不要这样做:
str1 = realloc(str1, arrayLength);
因为如果realloc
失败,您将孤立str1
之前指向的内存。代替:
char* temp = realloc(str1, arrayLength);
if (temp != NULL)
{
str1 = temp;
...
}
请注意,由于您要修改stringAppend
以返回新字符串,因此您应该在调用函数中执行类似的检查。
此外,“分隔符”拼写为两个As,而不是两个Es。