2013-09-26 3 views
1

Puis-je faire cela en C:tableau statiquement allouée argument de fonction en C

void myFunc(int *vp) { 
    // do some stuff with vp 
} 

int main() { 

    int v[5] = {1,2,3,4,5}; 
    myFunc(v); 

    return 0; 
} 

Je veux dire, ce serait le bon? myFunc (& v); ?

Merci!

+1

Demandez-vous parce que vous avez une erreur, ou demandez-vous si cela fonctionne de manière cohérente? – Ryan

+4

Essayez-le. Exécuter. Peut-être que ça fonctionne. De toute façon, vous apprenez quelque chose. :) – Bucket

+0

Oui! Je semble fonctionner. Quand je l'exécute sur VS2012 tout semble bien. Mais quand je l'exécute sous Linux, j'ai une erreur de segmentation. Je ne sais pas exactement si c'est le problème. J'ai eu une erreur de segmentation après 4 heures de calcul. J'ai demandé parce que je me doutais que cela pourrait être le problème. –

Répondre

3

Les tableaux se désintègrent en pointeurs lorsque vous les passez en arguments. Cependant, la désintégration du tableau n'est pas la même que celle de l'adresse d'un tableau. "Decay" est la façon dont certains types sont transformés lorsqu'ils sont passés en arguments de fonction. Même si le type de v est int [5], il devient int* lorsque vous le transmettez à une fonction. C'est un comportement que beaucoup de gens n'aiment pas, mais il n'y a rien à faire à ce sujet. Par contre, le type &v est int (*)[5], c'est-à-dire un pointeur vers un tableau de 5 entiers. Ce type ne se désintègre pas, c'est-à-dire qu'il ne se transforme pas automatiquement en un autre type si vous le transmettez en paramètre (et c'est aussi pourquoi ça ne fonctionnerait pas si vous l'utilisiez dans votre exemple, car vous avez besoin d'un pointeur aux entiers, pas un pointeur vers un tableau d'entiers). La "bonne" chose à faire (en supposant que la décroissance soit OK) est de faire myFunc(v), comme vous le faites dans votre extrait de code. Gardez à l'esprit que vous perdez des informations sur les limites des tableaux lorsque vous le faites.

1

Oui ... Votre code est correct.

Ici v==&v[0] nom du tableau est égale à l'adresse du premier élément du tableau

myFunc(v); 

passant nom du tableau comme argument qui signifie que vous passez l'adresse du premier élément dans le tableau.

void myFunc(int *vp) 

Ici, vous utilisez le pointeur. qui stocke l'adresse du premier élément du tableau qui est passé afin que vous puissiez accéder au bloc qui est couvert par le tableau.by en incrémentant l'emplacement du pointeur.

Et

myFunc(&v); 

    &v==&&v[0]; 

& v est l'adresse de l'adresse d'un tableau premier élément.

maintenant

void myFunc(int *vp)  

Ici vous avez obtenu l'adresse d'adresse de premier élément de tableau, ce ne pointe pas vers tableau. Au lieu de pointer l'emplacement de la mémoire. Maintenant, vous ne pouvez pas accéder au tableau en incrémentant le pointeur.

1

Votre code est correct Cela va fonctionner .... Mais vous devez faire particulièrement attention à vérifier les conditions aux limites. S'il vous plaît regarder à travers le code.

void myFunc(int *vp) { 
    vp[5] = 30; 
} 

int main() { 

    int v[5] = {1,2,3,4,5}; 
    int a = 10; 
    printf("Value of a before fun call %d\n", a); 
    myFunc(v); 
    printf("Value of a before fun call %d\n", a); 
    return 0; 
} 

De même

void myFunc(int *vp) { 
    vp[5] = 30; 
    myFunc2(vp); 
} 

void myFunc2(int *vp) { 
    vp[6] = 30; 
} 

int main() { 

    int v[5] = {1,2,3,4,5}; 
    int a = 10; 
    printf("Value of a before fun call %d\n", a); 
    myFunc(v); 
    printf("Value of a before fun call %d\n", a); 
    return 0; 
} 

Cela se traduira par une erreur de segmentation en raison de la pile Curruption.Puisque les variables locales sont en pile.

Questions connexes