2013-03-28 15 views
12

mam tej struktury w C Przykład:Jak przydzielić tablicę wskaźników dla ciągów przez malloc w C?

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

muszę skopiować ten array_pointers_of_strings do nowej tablicy ciągów sortowania. Potrzebuję tylko skopiować adres.

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

Moje pytanie brzmi: Jak przydzielić new_array [i] przez malloc() tylko adres strun?

Odpowiedz

5

to:

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

przydziela bufor wystarczająco duży, aby pomieścić 30 wskazówek do char (lub ciąg wskaźników, jeśli będzie) i przypisać do p jego adres.

p[0] jest wskaźnik 0, p[1] jest wskaźnik 1, ..., p[29] jest wskaźnik 29.


Old odpowiedź ...

Jeśli dobrze rozumiem pytanie, można też tworzyć stała liczba z nich po prostu deklarowania zmiennych typu message:

message msg1, msg2, ...; 

lub można al zlokalizować je dynamicznie:

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

Nie. Mam wskaźnik new_message z tablicą wskaźników ciągów. Potrzebuję przydzielić tablicę znaków dla trzydziestu ciągów znaków przez malloc. Nie wiem, jak przydzielić new_array dla adresu kopii ciągów ... – user1779502

+0

Zaktualizowano odpowiedź. –

10

Jak można zrozumieć z instrukcji przypisania w pętli while myślę, że trzeba tablicę ciągów Zamiast:

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

Uwaga: robi = w pętli while, jak poniżej:

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

dopiero przypisanie adresu sznurka (jej nie głęboko kopii), ale także dlatego, że pisząc "tylko adres ciągów "więc myślę, że tego właśnie chcesz.

Edit: Waring „odrzuty przypisania kwalifikacyjne z typ docelowy wskaźnik”

są coraz to ostrzeżenie, ponieważ jesteś przypisywania const char* do char*, które naruszają zasady const-poprawności.

Należy zadeklarować swój new_array jak:

const char** new_array;  

lub usunąć const w deklaracji 'array_pointers_of_strings' z wiadomości zwężenia.

+0

Tak, potrzebuję tego, ale coś na linii new_array [i] = new_message-> array_pointers_of_strings [i]; jest zła O_o Mój kompilator gcc napisz mi to ostrzeżenie: assgiment odrzuca kwalifikatory od typu celu wskaźnika – user1779502

+0

@ user1779502 ok przeczytaj zaktualizowaną odpowiedź. –

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]); 
    } 
} 
Powiązane problemy