0

我在这方面已经有一段时间了,我似乎没有弄清楚。

我有这个代码:

    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*)&parameterArray[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 

每次代码在重新分配部分崩溃时。

我几乎尝试了所有方法,但没有任何效果。请帮忙

4

3 回答 3

4

src是一个未初始化的指针,将保存一个随机内存地址。状态的先决条件realloc()。从链接的参考页面:

重新分配给定的内存区域。它必须事先由 malloc()、calloc() 或 realloc() 分配,并且尚未用 free() 释放,否则,结果是未定义的。

当使用realloc()将结果存储到临时变量时,以避免在失败时发生内存泄漏。

此外,调用也会导致未定义的行为strlen()正如manisrc首先指出的那样,必须以空值终止才能正常工作。中计算的空间必须增加一来为终止空字符分配额外的空间。 tmpstrlen()strcpy()realloc()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);
}
于 2013-04-10T09:24:40.753 回答
2

根据您的这一行代码,memcpy(tmp, (char*)&parameterArray[i].valueU8, length);您尝试复制valueU8必须分配有 Null 终止符的代码。否则会在这一行崩溃src = realloc(src, strlen(src) + strlen(tmp));

于 2013-04-10T09:29:32.273 回答
0

来自 realloc 的手册页

除非 ptr 为 NULL,否则它一定是由先前对 malloc()、calloc() 或 realloc() 的调用返回的。

你的 src 是一个未初始化的指针

于 2013-04-10T09:28:59.680 回答