web-dev-qa-db-fra.com

Comment allouer un tableau de pointeurs pour les chaînes par malloc en C?

J'ai cette structure en exemple C:

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

J'ai besoin de copier ce tableau_pointers_of_strings vers un nouveau tableau pour trier les chaînes. Je n'ai besoin que de copier l'adresse.

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

Ma question est: comment allouer new_array [i] par malloc () à la seule adresse des chaînes?

16
user1779502

Comme je peux le comprendre à partir de votre déclaration d'affectation dans la boucle while, je pense que vous avez plutôt besoin d'un tableau de chaînes:

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

Remarque: En faisant = dans la boucle while comme ci-dessous:

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

vous attribuez simplement l'adresse de la chaîne (ce n'est pas une copie complète), mais parce que vous écrivez également " uniquement l'adresse des chaînes " donc je pense que c'est ce que tu veux.

Edit: waring "l'affectation rejette les qualificatifs du type cible du pointeur"

vous recevez cet avertissement car vous attribuez un const char* à char* qui violerait les règles de const-correctness.

Vous devez déclarer votre new_array comme:

const  char** new_array;      

ou supprimez const dans la déclaration de 'array_pointers_of_strings' de la restriction de message.

14
Grijesh Chauhan

Cette:

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

allouera un tampon suffisamment grand pour contenir 30 pointeurs vers char (ou des pointeurs de chaîne, si vous voulez) et assignera à p son adresse.

p[0] est le pointeur 0, p[1] est le pointeur 1, ..., p[29] est le pointeur 29.


Ancienne réponse ...

Si je comprends bien la question, vous pouvez soit en créer un nombre fixe en déclarant simplement des variables de type message:

message msg1, msg2, ...;

ou vous pouvez les allouer dynamiquement:

message *pmsg1 = malloc(sizeof(message)), *pmsg2 = malloc(sizeof(message)), ...;
5
Alexey Frunze
#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]);
    }
}
4
Hal Canary