2013-04-10 113 views
0

我已经在这一段时间相当长一段时间了,而且我似乎没有想到它。将Char数组添加到Char指针

我有这样的代码:

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 

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

我已经尝试了几乎所有的东西,没有任何工作。请帮忙

+1

你不说你的问题是什么,但请注意,你应该为空终止符添加1到'realloc'的大小。如果'parameterArray [i] .valueU8'不能保证以null结尾,你也会遇到问题。 – simonc 2013-04-10 09:11:32

+0

什么不起作用? 'parameterArray'是如何定义的? – 2013-04-10 09:11:47

+0

对不起,我编辑了我的问题 – flexzican 2013-04-10 09:16:18

回答

4

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); 
} 
+0

+1,虽然'realloc()'的参数也可以是NULL,在这种情况下'realloc()'就像'malloc()'一样。 – Hasturkun 2013-04-10 09:30:41

+0

@Hasturkun,谢谢。就像它在示例代码中一样。 :) – hmjd 2013-04-10 09:32:30

+0

好吧,我知道你的意思。如果我想将字符用于其他目的而不是将其打印在屏幕上,我仍然有义务添加终止空字符? – flexzican 2013-04-10 09:33:13

0

除非PTR是NULL,则必须已返回由以前调用到的malloc(),释放calloc()或realloc realloc的手册页()。

和你的src是未初始化的指针

2

按照您此行memcpy(tmp, (char*)&parameterArray[i].valueU8, length);你试图复制valueU8必须以空终止被分配的代码。否则它会崩溃在这一行src = realloc(src, strlen(src) + strlen(tmp));

+0

+1发现此问题。 – hmjd 2013-04-10 09:34:00