2013-07-12 2 views
0

Je sais comment modifier un tableau de pointeurs dans main, mais je ne sais pas comment le faire lorsque ma fonction a besoin de le modifier. Le code entre ** est comment je le fais en main sans utiliser une fonction. Je sais comment imprimer le tableau de pointeur de pointeur. Ma question est, supposons que je veux déplacer ces lignes ** dans la fonction(), que dois-je modifier?comment passer tableau de pointeur de pointeurs vers une fonction?

code:

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

void function(char *array[], int size); 
void function_print(char *array[], int size); 
int main() 
{ 
    char *array[] = {0}; 

    char word[20]; 

    **scanf("%s", word); 
    int len = strlen(word) + 1; 
    array[size] = (char *)malloc(sizeof(len));   
    strlcpy(array[size], word, sizeof(array[size]));** 


    function(array, 0); 

    return 0; 
} 

void function(char *array[], int size) 
{ 

} 

void function_print(char *array[], int size) 
{ 
    for(int x = 0; x < size; x ++) 
    { 
     printf("%s", *array); 
     (array)++; 
    } 
} 


~ 
~ 
+0

Ce que vous faites n'a pas de sens * avant * à votre appel de fonction. Il ne semble pas que vous ayez besoin d'un tableau de pointeurs pour faire ce que vous pourriez faire. De plus, les deux endroits où vous utilisez 'sizeof()' semblent problématiques et ne font probablement pas ce que vous voulez. Vous pourriez obtenir de meilleures réponses en clarifiant ce que vous avez l'intention de faire. – antak

Répondre

1

J'ai fait quelques éditer et réalisé votre fonction fera la même chose. Alors continuez, et lisez le EDIT si vous ne savez pas comment cela fonctionne. En outre, je pense qu'il y a quelque chose qui ne va pas dans votre main(). D'abord, array [taille] = (char *) malloc (sizeof (len)); a tendance à signaler une erreur car aucune taille n'est définie ici. Deuxièmement, si par taille vous voulez dire le nombre d'éléments dans le tableau, alors array [taille] provoquerait un débordement. Troisièmement, l'argument de malloc devrait être sizeof (char) * len, pas sizeof (len), puisque ce dernier est égal à sizeof (int).

Changer votre fonction

void function(char **, int); 

et l'appeler par

function(array, 0); 

EDIT

Je pense par "modifier" Vous voulez changer les pointeurs stockés dans le tableau . Puisque chaque élément est un char*, un char** fera l'affaire. En tant qu'argument, vous passez l'adresse du premier élément. Ensuite, dans la fonction, vous le recevez avec un char** parray. Puisque vous avez également passé la taille, vous pouvez l'utiliser comme char* parray[], et l'adresse de chaque élément est exactement la même avec array dans . Ainsi, toute modification effectuée avec parray changera array. Est-ce que c'est ce que tu veux?

+3

Il n'y a aucune différence entre 'void function (char * array [], taille int);' et 'void function (char **, int);'. – aschepler

+1

cette «fonction» n'est-elle pas pratiquement la même que celle qu'il avait? – antak

+0

votre réponse seulement laissez-moi imprimer mon tableau de pointeurs, et si j'ai besoin d'initialiser mon tableau de pointeurs de pointeurs? – user1701840

-2

Essayez de faire:

void function(char *array, int size)(); 

Et au lieu de:

function(array,0); 

parce que ce tableau lui-même est une adresse memroy.

0

Vous ne faites aucune erreur en appelant la fonction et en passant le tableau de pointeurs char. C'est une bonne façon. Votre programme n'a pas compilé pour moi, donc fait quelques petits changements. Ça marche.

#include<stdio.h> 
    #include<string.h> 
    #include<stdio.h> 
    #include<string.h> 
    #include<stdlib.h> 
    #include<iostream> 

    void function(char *array[], int size); 
    int main() 
    { 
     char *array[] = {0}; 
     char word[20]; 
     scanf("%s", word); 
     int len = strlen(word) + 1; 
     array[0] = (char *)malloc(sizeof(len));   //that how I do it in main without using a function. 
     strcpy(array[0], word); 


     function(array, 0); 

     return 0; 
    } 

    void function(char *array[], int size) 
    { 
     char * temp = new char[strlen(array[0])+1]; 
     strcpy(temp, array[0]); 
     printf(temp, 's'); 

    } 
+0

Ce n'est pas C << là. – tchrist

+0

Ohh! C'est bête. Il suffit de regarder dans la section qui passe le tableau qui est le point en question. – Messiah

+0

Edité l'instruction de sortie après le commentaire de tchrist ... – Messiah

0

Écrire ceci:

void function(char *array[], int size)

et ceci:

void function(char **array, int size)

sont les mêmes dans ce contexte.

Si vous définissez une fonction comme celui-ci alors ce ne est pas nécessaire de déclarer comme la même chose, vous pouvez le déclarer comme: void function(char **, int);

déclaration

ne décrit que le type de retour et le type d'arguments d'un function.Now, d'autres recommandations:

ne pas utiliser lascanf comme ceci:

scanf("%s", word);// you need to specify field width in case of strings otherwise it will overwrite buffer in case of large strings donc le faire comme ceci:

scanf("%19s",word);

size ne définit pas votre principale, au lieu, je préférerais le faire de cette façon:

size_t len = sizeof(word) + 1;// yes, try to use size_t when returning number of bytes 
    *array = (char*)malloc(sizeof len);// casting malloc is not recommended though. 
    strncpy(*array, word,len); 
Questions connexes