2010-10-15 7 views
0

Bonjour Quelqu'un peut-il expliquer pourquoi la deuxième Cout Func (char * p) ne fonctionne pas:C++ pointeur Cout

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

using namespace std; 

char *strhex(char *str); 
char *func(char *p); 

int main() 
{ 
    char *ptr;  

    char *p=strhex("d"); 
    cout<<"main:"<<p<<endl; 

    cout<<func(p)<<endl; 

    system("PAUSE"); 
    return 0; 
} 

char *func(char *p) 
{ 
     cout<<"func1:"<<p<<endl; 
     char buffer[500]=""; 
    char *zbuffer = buffer; 
     cout<<"func2:"<<p<<endl; ///doesn't work 

     return zbuffer; 
} 

char *strhex(char *str) 
{ 
    char buffer[500]=""; 
    char *pbuffer = buffer; 
    int len = strlen(str); 

    for(int i = 0; i < len ;i++) 
    { 
    itoa(str[i],pbuffer,16); 
     pbuffer +=2; 
    }; 

    *pbuffer = '\0'; 
    pbuffer=buffer; 

    return pbuffer; 
} 

Edit: J'utilise DEV C++ sous Windows 4.9.9.2

+8

Que voulez-vous dire par "ne fonctionne pas?" –

+0

Renvoyer un pointeur vers une variable locale est probablement une mauvaise idée, mais probablement sans rapport avec votre problème. –

+3

@Carl: Probablement la cause exacte, en fait. L'espace de pile occupé par 'buffer' dans' strhex() 'sera occupé par' buffer' dans 'func()'. –

Répondre

4

Un gros problème ici est que strhex renvoie un pointeur vers une variable locale (buffer[]). Cette variable est hors de portée à la fin de la fonction, de sorte que la valeur renvoyée pointe vers des contenus de mémoire indéfinis qui peuvent être écrasés à tout moment.

1

Tout votre code ne fonctionne pas. Les deux fonctions renvoient des pointeurs vers des tableaux locaux, qui ne pointent vers rien de valable après le retour de la fonction. Cela provoque un comportement indéfini. Étant donné que la valeur de p est l'un de ces pointeurs non valides, vous ne pouvez pas en tenir compte à un moment donné - cette mémoire est probablement écrasée pendant func(). Vous devez soit new[] et delete[] la mémoire appropriée ou, de préférence, utiliser une structure de données C++ appropriée comme std::string.

0

Il semble que cela fonctionne, mais le second cout de main n'imprime pas de valeur car vous renvoyez un tampon vide.

0

Ajout des réponses autres:

Vous ne devez pas réinitialiser pbuffer pour pointer vers le début du tableau, puis retourner sa valeur:

pbuffer=buffer; 
return pbuffer; 

vous pouvez juste dire

return buffer; 

le nom du tableau est également un pointeur (pointeur sur le premier élément du tableau)