[英]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.