Как выделить массив указателей для строк по malloc в C?
У меня есть эта структура в C
Пример:
typedef struct
{
const char * array_pointers_of_strings [ 30 ];
// etc.
} message;
Мне нужно скопировать массив array_pointers_of_strings в новый массив для строк сортировки. Мне нужно только скопировать адрес.
while ( i < 30 )
{
new_array [i] = new_message->array_pointers_of_strings [i];
// I need only copy adress of strings
}
Мой вопрос: как выделить new_array [i] по malloc() только для адреса строк?
Ответы
Ответ 1
Как я понимаю из вашего оператора присваивания во время цикла, я думаю, что вам нужен массив строк:
char** new_array;
new_array = malloc(30 * sizeof(char*)); // ignore casting malloc
Примечание. Выполняя =
в цикле while, как показано ниже:
new_array [i] = new_message->array_pointers_of_strings [i];
вы просто назначаете адрес строки (ее не глубокую копию), а потому, что вы также пишете "только адрес строк", поэтому я думаю, что это то, что вы хотите.
Редактировать: waring "присваивание отбрасывает квалификаторы из целевого типа указателя"
вы получаете это предупреждение, потому что вы назначаете const char*
to char*
, который будет нарушать правила const-correctness.
Вы должны объявить свой new_array как:
const char** new_array;
или удалите const
в объявлении 'array_pointers_of_strings' из строкой сообщения.
Ответ 2
Это:
char** p = malloc(30 * sizeof(char*));
будет выделять буфер, достаточно большой, чтобы удерживать 30 указателей на char
(или указатели на строки, если вы это сделаете) и назначить p
его адрес.
p[0]
- указатель 0, p[1]
- указатель 1,..., p[29]
- указатель 29.
Старый ответ...
Если я правильно понял вопрос, вы можете либо создать фиксированное число из них, просто объявив переменные типа message
:
message msg1, msg2, ...;
или вы можете выделить их динамически:
message *pmsg1 = malloc(sizeof(message)), *pmsg2 = malloc(sizeof(message)), ...;
Ответ 3
#include <stdio.h>
#include <stdlib.h>
#define ARRAY_LEN 2
typedef struct
{
char * string_array [ ARRAY_LEN ];
} message;
int main() {
int i;
message message;
message.string_array[0] = "hello";
message.string_array[1] = "world";
for (i=0; i < ARRAY_LEN; ++i ) {
printf("%d %s\n",i, message.string_array[i]);
}
char ** new_message = (char **)malloc(sizeof(char*) * ARRAY_LEN);
for (i=0; i < ARRAY_LEN; ++i ) {
new_message[i] = message.string_array[i];
}
for (i=0; i < ARRAY_LEN; ++i ) {
printf("%d %s\n",i, new_message[i]);
}
}