2013-04-10 4 views
0

Я уже давно нахожусь в этом фове, и я, похоже, не понимаю его.Добавление массива Char в Char pointer

У меня есть этот код:

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' не гарантируется, что оно завершено нулем. – simonc

+0

Что не работает? Как определяется параметр parameterArray? –

+0

Извините, я отредактировал свой вопрос – flexzican

ответ

4

src - это унифицированный указатель и будет содержать произвольный адрес памяти. Предпосылки для состояния realloc(). со страницы с ссылки:

Перераспределяет заданную область памяти. Он должен быть предварительно назначен malloc(), calloc() или realloc() и еще не освобожден с помощью free(), в противном случае результаты не определены.

При использовании realloc() сохранить результат во временную переменную, чтобы избежать утечки памяти в случае выхода из строя.

Кроме того, вызов strlen() на src также приведет к неопределенному поведению. Как указано выше, manitmp должно быть нулевым, чтобы для корректной работы strlen() и 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); 
} 
+0

+1, хотя аргумент 'realloc()' также может быть NULL, и в этом случае 'realloc()' действует как 'malloc()'. – Hasturkun

+0

@Hasturkun, спасибо. Как и в примере кода. :) – hmjd

+0

Хорошо, я знаю, что вы имеете в виду. Если я хочу использовать символы для других целей, кроме как распечатать их на экране, я все равно должен будет добавить завершающий нулевой символ? – flexzican

0

От человека страниц перераспределить

Если PTR не NULL, то он должен быть возвращенным предыдущим вызовом таНос(), calloc() или перераспределить().

и ваш ЦСИ является неинициализированным указатель

2

Согласно код этой линии memcpy(tmp, (char*)&parameterArray[i].valueU8, length); вы пытаетесь скопировать valueU8, который должен быть назначен с Null терминатор. В противном случае произойдет сбой в этой строке src = realloc(src, strlen(src) + strlen(tmp));

+0

+1 Для определения этого. – hmjd