2016-10-31 5 views
0

です。function.cとmain.cというファイルがあります。 function.cではこの 機能関数内のポインタはアドレスを変更しますが、ポインタの外は0x0

int GetRow(int descriptor,char* src) 
{ 
    char app[1]; 
    char* carattere= (char*)malloc(sizeof(char)); 
    int count=0; 
    int capp=0; 

    while((capp=read(descriptor,app,sizeof(char)))>0 
     &&app[0]!=';') 
    { 
     if(app[0]!='\n') 
     { 
      carattere[count]=app[0]; 
      carattere=(char*)realloc(carattere,sizeof(char)*(++count +1)); 
     } 
    } 
    src=carattere; 
    if(capp<0) 
    { 
     return -1; 
    }; 
    #define DEBUG 
    #ifdef DEBUG 
    printf("The line Detected was %s %s\n",carattere,src); 
    #endif 

} 

があると私はリターン同じ事新しいアドレスにSRCポイントかどうかを確認するためのprintfを使用する場合には、becouse働きます。 私はprintfのitprintヌルを使用する場合、私はGetRowを

char* pointer; 
int file=open("prova.conf",O_RDWR); 
GetRow(file,pointer); 
printf("%s",pointer); 

Becouseを呼び出すmain.cの中で生まれた問題。 gdbを使用してGetRowを呼び出すと、ポインタポイント0x0がわかります。だから誰も私の問題を伝えて説明できますか?ありがとう、私の英語のための私の言い訳。

+0

['malloc()'と 'C 'のファミリの戻り値をキャストしない理由についてのこのディスカッションを参照してください。](http://stackoverflow.com/q/605845/2173917) –

+1

これは多くの質問です。署名を 'int GetRow(int descriptor、char ** src)'に変更し、ポインタへのポインタを渡し、それに応じて残りのコードを変更します。 – dasblinkenlight

+0

関数内の入力引数の値を変更しても、関数外のこの引数の値には影響しません。 –

答えて

2

char * srcを引き続き値で渡します。ポインタの値を変更したい場合は、参照を渡す必要があります。 char ** srcを使用し、* src = carattereを設定します。

ちょうどあなたがポインタを渡しているからといって、必ずしも参照渡しを意味するわけではありません。 mainのsrcのメモリをmallocしてそのメモリへの参照を渡すと(char * srcのように)、その参照の値を* src = * carattereで変更することができますが、それはおそらくあなたが望むものではありません。

関連する問題