2012-03-01 58 views
0
typedef struct 
{ 
    int A; 
    int B; 

    char* C; // problem is here 
}foo; 

int SetA(void) 
{ 
    .... 
    return retval; 
} 

int SetB(void) 
{ 
    .... 
    return retval; 
} 

const char* bar(void) 
{ 
    ..... 
    char* retval="return val"; 
    ..... 
    return retval; 
} 

void SetFoo(foo* paramFoo) 
{ 
paramFoo->A = SetA(); 
paramFoo->B = SetB(); 

paramFoo->C = bar(); 

} 


static foo staticFoo; 

void main() 
{ 
    SetFoo(&staticFoo); 
    printf("%s",staticFoo.C);// printing 
} 

struct fooの "char * C"はうまく書かれません。どうして?私は間違いを犯したのか、あまりにも正しいのかを知る必要があります。私はbar()を実行し、正しい値を返します。構造体メンバへのポインタ

ありがとう 〜最大

+0

plsは書式設定を修正します – Matteo

+1

「うまく書かれません」とはどういう意味ですか?どのように伝えることができますか? – cnicutar

+0

@cnicutar何も書き込まれません、私はそれをfprintしようとすると、それは私に何も与えません。 –

答えて

3

私はリテラルが破壊され得るとき、読み取り専用の文字列を心配する必要はいけないように、私は、それをmallocを使用して好む以降freeでしょう。

const char* bar(void) 
{  
    const char* retval="return val"; 
    char * value = malloc(strlen(retval) + 1); // +1 for the termination 
                // character 
    strcpy(value, retval); 
    retrun value ; 
} 

戻り値は不要になったときに覚えておいてください。

+0

を印刷していただきありがとうございました。 –

+0

私は不思議です - 実際に問題をどのように修正しましたか?問題はポインタの割り当てですか? –

+0

@DrewDormann私はいつでも私はそれを(無料)を破壊することができますので、私はSetFoo()でそれを使用することができますので、動的メモリ割り当て(malloc)は良い選択である前に、読み取り専用の文字列(バーのretval)が破壊されていたと思う。 –

0

ファンクションバーの文字列はローカル変数です。 mallocでメモリバッファを作成するか、グローバル変数として宣言する必要があります。

char* bar(void) 
{  
    char* retval=malloc(100*sizeof(char)); //malloc the buffer 
    strcpy(retval,"return val"); 
    retrun retval ; 
} 

または

char * str = "return val"; 
const char* bar(void) 
{ 
    ..... 
    char* retval = str; 
    ..... 
    return retval; 
} 
2

何かは、あなたがそれを述べてきたように、それは実際に動作するはずですので、一例と間違っているように見えます。

バーがローカル変数を返すという考え方には、他の回答が2つ挙げられていますが、それは戻りません。つまり、返される文字列はコンパイル時に割り当てられ、スタックに動的に割り当てられません。前記文字列へのポインタは、実際には、後のコードに戻すことは技術的に安全です。

あなたの例は、実際のテストコードを正確に反映していないと思います。

0

私はペリーの答えに同意します。定数文字列は、スタック上ではなく、読み取り専用データセクションに割り当てられます。 foo()では、定数文字列を返しています。どこからでも安全にアクセスできます。

まず、コードを手動で入力しました。あなたはそれをコンパイルしなかった。あなたのメインでは、次のようなコードがあります:

SetFoo(&staticfoo); 
    printf("%s",staticFoo.C); 

staticfooとstaticFooの両方のオブジェクトが同じでないことがわかります。修正してプログラムを実行すると、文字列が出力されるはずです。それは私の場合に印刷されています。

関連する問題