2013-03-28 5 views
12

Ho questa struct in C Esempio:Come allocare array di puntatori per stringhe di malloc in C?

typedef struct 
{ 
    const char * array_pointers_of_strings [ 30 ]; 
    // etc. 
} message; 

ho bisogno di copiare questo array_pointers_of_strings a nuovo array per le stringhe di ordinamento. Ho bisogno solo di copiare l'indirizzo.

while (i < 30) 
{ 
    new_array [i] = new_message->array_pointers_of_strings [i]; 
    // I need only copy adress of strings 
} 

La mia domanda è: come allocare new_array [i] da malloc() solo per indirizzo di stringhe?

risposta

5

questo:

char** p = malloc(30 * sizeof(char*)); 

sarà allocare un buffer abbastanza grande da contenere 30 puntatori a char (o puntatori di stringa, se si vuole) e assegnare alla p il suo indirizzo.

p[0] è puntatore 0, p[1] è puntatore 1, ..., p[29] è puntatore 29.


Vecchio risposta ...

Se ho capito bene la domanda, è possibile creare un numero fisso di loro con la semplice dichiarazione di variabili del tipo message:

message msg1, msg2, ...; 

oppure è possibile al localizzarli in modo dinamico:

message *pmsg1 = malloc(sizeof(message)), *pmsg2 = malloc(sizeof(message)), ...; 
+0

No. Ho il puntatore new_message con una serie di puntatori di stringhe. Ho bisogno di allocare array di caratteri per trenta stringhe di indirizzo da malloc. Non so come allocare new_array per l'indirizzo di copia delle stringhe ... – user1779502

+0

Aggiornamento della risposta. –

10

Come posso capire dalla tua istruzione di assegnazione in ciclo while Penso che avete bisogno array di stringhe, invece:

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

Nota: Facendo = nel ciclo while, come di seguito:

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

si sta solo assegnando indirizzo della stringa (non la sua copia completa), ma perché si sta anche scrivendo "unico indirizzo di stringhe "quindi penso che questo è quello che vuoi.

Edit: Waring "si disfi assegnazione qualificazioni dal tipo di target puntatore"

hai trovato questo avviso perché si sta assegnando un const char*-char* che violerebbe le regole di const correttezza.

Si dovrebbe dichiarare la new_array come:

const char** new_array;  

o rimuovere const nella dichiarazione di 'array_pointers_of_strings' dal messaggio di stenosi.

+0

Sì, ho bisogno di questo, ma qualcosa in linea new_array [i] = new_message-> array_pointers_of_strings [i]; è sbagliato O_o Il mio compilatore gcc mi scrive questo avviso: assgiment scarta i qualificatori dal tipo di puntatore al target – user1779502

+0

@ user1779502 ok leggi la risposta aggiornata. –

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]); 
    } 
}