【问题标题】:Appending Char array to Char pointer将 Char 数组附加到 Char 指针
【发布时间】:2013-04-10 09:10:14
【问题描述】:

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

我有这个代码:

    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 

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

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

【问题讨论】:

  • 你没有说你的问题是什么,但请注意你应该在realloc 的大小上添加 1 作为空终止符。如果parameterArray[i].valueU8 不能保证为空终止,您也会遇到问题。
  • 什么不起作用? parameterArray 是如何定义的?
  • 抱歉我编辑了我的问题
  • 在调用realloc()之前显示src的定义和任何使用。
  • 我只声明过,unsigned char *src;

标签: c arrays pointers copy char


【解决方案1】:

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

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

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

此外,在src 上调用strlen() 也会导致未定义的行为。正如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,虽然realloc() 的参数也可能为NULL,在这种情况下realloc() 的作用类似于malloc()
  • 好的,我知道你的意思。如果我想将字符用于其他目的而不是将其打印在屏幕上,我是否仍有义务添加终止空字符?
  • @flexzican,几乎所有的 c 字符串函数都依赖于空终止。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    来自 realloc 的手册页

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

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

    【讨论】:

      猜你喜欢
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2018-04-05
      • 2015-10-26
      • 2014-06-28
      • 2021-12-14
      • 1970-01-01
      相关资源
      最近更新 更多