簡體   English   中英

指向結構成員的指針

[英]pointer to struct member

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()並且它返回了正確的值。

謝謝〜麥克斯

我寧願使用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 ;
 }

請記住,在不再需要時free返回值。

正如您所陳述的,該示例似乎有問題,因為它實際上可以正常工作。

給出的其他兩個答案似乎不正確地集中在bar正在返回局部變量的想法上,但事實並非如此-它返回的字符串是在編譯時分配的,而不是在堆棧上動態分配的。 實際上,指向該字符串的指針在技術上可以安全地返回到以后的代碼。

我的猜測是您的示例無法准確反映您的實際測試代碼。

功能欄中的字符串是局部變量。 您需要通過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;
}

我同意佩里的回答。 常量字符串分配在只讀數據段中,而不是堆棧中。 在foo()中,您將返回一個常量字符串,可以從任何位置安全地訪問它。

首先,您手動輸入了代碼。 您沒有編譯它。 在您的主體中,您有如下代碼:

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

您會看到對象staticfoo和staticFoo都不相同。 如果您修復它並運行該程序,則應該打印出字符串。 它印在我的情況下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM