2013-04-10 116 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