2013-03-28 2 views
12

Я имею эту структуру в C Пример:Как выделить массив указателей для строк по malloc в 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 [я] по таНосу() только для строк адреса?

ответ

5

Это:

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)), ...; 
+0

Нет У меня есть указатель new_message с массивом указателей строк. Мне нужно выделить массив символов для тридцати адресных строк malloc. Я не знаю, как выделить new_array для копирования адреса строк ... – user1779502

+0

Обновлен ответ. –

10

Как я могу понять из Вашего оператора присваивания в то время как цикл, я думаю, вам нужно массив строк вместо:

char** new_array; 
new_array = malloc(30 * sizeof(char*)); // ignore casting malloc 

Примечание: Делая = в то время как петли, как показано ниже:

new_array [i] = new_message->array_pointers_of_strings [i]; 

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

Edit: Варинг «выкидывают назначения отборочных от целевого указателя типа»

вы получаете это предупреждение, потому что вы присваиваете const char* к char*, которые нарушают правила сопзИте корректности.

Вы должны объявить new_array как:

const char** new_array;  

или удалить const в объявлении 'array_pointers_of_strings' из сообщения стриктуры.

+0

Да, мне это нужно, но что-то в строке new_array [i] = new_message-> array_pointers_of_strings [i]; неверно O_o Мой компилятор gcc напишите мне это предупреждение: assgiment отбрасывает квалификаторы от целевого типа указателя – user1779502

+0

@ user1779502 ok прочитал обновленный ответ. –

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]); 
    } 
} 
Смежные вопросы