我现在已经有一段时间了,我似乎没弄明白。
我有这段代码:
unsigned char *src;
int length = (parameterArray[i].sizeInBits/8) + 1; // check how long array should be
unsigned char tmp[length]; // declare array
memcpy(tmp, (char*)¶meterArray[i].valueU8, length); // in this case copy char to array
src = realloc(src, strlen(src) + strlen(tmp)); // reallocate space for total string
strncat(src, tmp, strlen(tmp)); // merge
每次代码在重新分配部分崩溃时。
我几乎尝试了一切,但没有任何作用。请帮忙
答案 0 :(得分:4)
src
是一个单位化指针,它将保存一个随机存储器地址。 realloc()
状态的先决条件。来自链接的参考页面:
重新分配给定的内存区域。 它必须先由malloc(),calloc()或realloc()分配,但尚未使用free()释放,否则结果未定义。
使用realloc()
将结果存储到临时变量时,以避免在发生故障时发生内存泄漏。
此外,在strlen()
上调用src
也会导致未定义的行为。正如mani tmp
首先指出的那样必须为空终止才能使strlen()
和strcpy()
正常工作。必须将realloc()
中计算的空间增加1,以便为终止空字符分配额外的char
。
示例代码修复:
unsigned char tmp[length + 1];
memcpy(tmp, parameterArray[i].valueU8, length);
tmp[length] = 0;
unsigned char* src = NULL;
unsigned char* src_tmp = realloc(src, (src ? strlen(src) : 0) + strlen(tmp) + 1);
if (src_tmp)
{
if (!src) *src_tmp = 0; /* Ensure null character present before strcat(). */
src = src_tmp;
strcat(src, tmp);
}
答案 1 :(得分:2)
根据此行memcpy(tmp, (char*)¶meterArray[i].valueU8, length);
的代码,您尝试复制必须使用Null终结符分配的valueU8
。否则它将在此行src = realloc(src, strlen(src) + strlen(tmp));
答案 2 :(得分:0)
来自realloc的手册页
除非ptr为NULL,否则必须先通过对malloc(),calloc()或realloc()的调用返回。
并且你的src是一个未初始化的指针