2009-07-01 9 views
1

Si j'ai un tableau de pointeurs char et un autre tableau statique de caractères, comment affecter chaque élément du tableau de pointeurs à chaque élément d'un tableau statique?Attribuer un tableau de pointeurs au tableau

(Essayer de décomposer un problème en un problème plus petit.)

Merci.

array of pointers       array of char 
    +----+           +----+       
    | |  ---->        | | 
    | * |           | h | 
    +----+           +----+ 
    | * |           | i | 
    | |   ---->        | | 
    +----+           +----+ 
+2

Vous voulez copier un caractère * [] dans un caractère [] []? – dfa

+1

Pas sûr en fonction de la syntaxe, s'il vous plaît voir ma belle art ASCI =) –

+0

quelle langue? –

Répondre

3

j'improvise la réponse de Tomi ici.
Les autres sont trop longs pour une telle question.

char chrArr[] = "asd"; 
char* ptrArr[sizeof(chrArr)]; 
int i; 

// A simple assignment loop over 'i' pointers and chars 
for (i=0; i< sizeof(chrArr); i++) 
    ptrArr[i] = &chrArr[i]; 
    --------- ---------- 
// pointer = address of character 

Depuis je sizeof vous obtenez un 4ème pointeur ici qui pointe vers le caractère de terminaison NULL de la chaîne.

+1

Pas mal, mais vous ne pouvez pas créer un tableau de taille variable en C - changez la définition de ptrArr en: char * ptrArr [3]; – DaveR

+0

Vous avez raison, j'ai été mélangé avec strlen et sizeof ... en fait, je l'ai lu comme sizeof puisque cela fonctionnera (c'est le genre d'erreur que j'ai souvent vu les gens faire dans les critiques de code). Le corriger maintenant – nik

+0

Ou vous pouvez le malloc, s'il essaie de l'utiliser dans une structure de données. – jkeys

0

"Si j'ai un tableau de pointeurs CHAR"

char ** arr;

« et un autre tableau statique de caractères »

omble str [] = « Salut à »

« comment puis-je attribuer à chaque élément du tableau de pointeurs vers chaque élément d'un tableau statique? "

len = strlen(str); 
arr = (char **)malloc(sizeof(char *) * len);/*typecasting for C++ */ 
if (arr != NULL) 
{ 
    for(i=0; i < len; i++) 
    { 
    arr[i] = (char *)malloc(sizeof (char)); /* typecasting for C++ */ 
    if (arr[i] != NULL) 
     { 
     arr[i] = &str[i]; 
     } 
    else 
     { 
     /*If you choose to return from here, 
      * free allocated memory upto now 
      */ 
     for(j=0;j<i;j++) 
      { 
      free(arr[j]); 
      } 
     free(arr); 
     return 1; 
     } 

    } 
} 

Espérons que cela aide.

+0

Merci d'avoir ramené des * pointer * mémoires. –

+0

c'est beaucoup trop long et la façon dont il libère la mémoire est complètement faux. Vous tirez des trucs du tas pour qu'il y ait des déchets aléatoires, que vous essayez alors de libérer? –

+0

Bien trop long je suis d'accord. Pouvez-vous expliquer pourquoi la mémoire de libération est complètement fausse. –

1

Aditya a de nouveau soumis votre réponse. Je ne sais pas pourquoi vous avez alloué tous les pointeurs. « Si j'ai un tableau de pointeurs CHAR »

char** arr; 

« et un autre tableau statique de caractères »

char str[]="Hi there"; 

« comment puis-je attribuer à chaque élément du tableau de pointeurs sur chaque élément d'une tableau statique? "

len = strlen(str); 
arr = (char **) malloc(sizeof(char *) * len); /*typecasting for C++ */ 
if (arr != NULL) 
{ 
    int i=0; 
    for(i=0; i < len; i++) 
    arr[i]=&str[i]; 
} else { 
    // error handling 
} 

Bien sûr, ces pointeurs ne sont valables que jusqu'à ce tableau str statique existe (normalement jusqu'à ce que vous quittez le bloc d'instructions). Très sujettes aux erreurs, mais c'était précisément votre demande.

+0

L'OP voulait "assigner chaque élément du tableau de pointeurs à chaque élément d'un tableau statique?" ... n'est pas chaque élément du tableau statique un char au lieu d'un char *. C'est la raison pour laquelle j'ai mallocé à l'intérieur de la boucle pour chaque élément. –

0
char **getPointers(char *initArr) { 
char **arr; 
int len, i; 

if(initArr == NULL) return NULL; 

/* + 1 for the null terminator */ 
len = strlen(initArr) + 1; 

arr = (char **) malloc(sizeof(char *) * len); 

/* since initArr is an array, we know the characters are contiguous in memory, 
    so let's trust pointer arithmetic instead of dereferencing references we 
    create */ 
for(i = 0; i < len; i++) arr[i] = initArr + i; 

return initArr; 
} 
+0

"comment assigner chaque élément du tableau de pointeurs à chaque élément d'un tableau statique?" ..... n'est pas chaque élément du tableau statique un char au lieu d'un char *. –

2
char chrArr[] = "asd"; 
char* ptrArr[strlen(chrArr)]; 

char* chrPtr = chrArr; 
char** ptrPtr = ptrArr; 

while (*chrPtr) 
    *ptrPtr++ = chrPtr++; 
Questions connexes