Как выделить массив указателей для строк по 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]);
    }
}