2013-12-02 4 views
1

Сегодня мне сказали, что я могу легко взять содержимое статического массива и скопировать данные на динамически выделенный. Я долго искал и до сих пор не нашел хорошего объяснения, как и почему это возможно. Например, если у меня есть код следующим образом,Назначение значений из статического массива символов динамически выделенному массиву символов

int i = 0; 
char array[64]; 
for (; i < 64; ++i) 
{ 
    array[i] = "a"; 
} 

char* dynamicArray = (char*) malloc (sizeof (char*) * strlen (array)); 

мне сказали, что я мог бы взять содержимое массива, который в данном случае представляет собой массив элементов а, и скопировать эти данные на мой динамический массив. Я все еще смущен тем, как я могу это сделать, поскольку такие функции, как memcpy и strcpy, не работают со статическим массивом. Возможно ли такое копирование? Спасибо за помощь, и я надеюсь, что мои объяснения будут в порядке.

ответ

3

Ваш код имеет несколько вопросов:

array[i] = "a"; 

пытается присвоить строку (массив символов) к одному char. Вы должны использовать 'a' для определения одного символа.

char* dynamicArray = (char*) malloc (sizeof (char*) * strlen (array)); 

выделяет память, но не назначает ее. strlen(array) также небезопасен; strlen подсчитывает количество символов до нулевого терминатора, но array не имеет одного.

Ваш код должен выглядеть примерно так

int i = 0; 
char array[64]; 
for (; i < 63; ++i) { 
    array[i] = 'a'; 
} 
array[63] = '\0'; 
char* dynamicArray = malloc (strlen(array)+1); // +1 for nul terminator 
strcpy(dynamicArray, array); // copy contents of array into dynamicArray 
// use array 
free(dynamicArray); // must have exactly one call to free for each call to malloc 
+0

Большое спасибо за объяснения его вместе с комментариями. Это очень помогло. Другой вопрос: если бы я использовал этот метод копирования в функции, то, используя его для вставки скопированных данных в список, есть ли способ освободить память после вставки без потери вставленных данных? – user3040968

Смежные вопросы