2012-03-01 197 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」不會被正確寫入。爲什麼?我需要知道我是否犯錯,以及如何糾正它?我已經跑了吧(),它返回正確的值。指向結構成員的指針

謝謝 〜最大

+0

請修復格式 – Matteo 2012-03-01 17:44:59

+1

你是什麼意思「寫得不好」。你怎麼知道 ? – cnicutar 2012-03-01 17:46:14

+0

@cnicutar沒有什麼會被寫入,當我嘗試印刷它時,它不會給我任何東西。 – 2012-03-01 17:48:55

回答

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 ; 
} 

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

+0

謝謝,這很有幫助。 – 2012-03-01 18:28:07

+0

我很好奇 - 這究竟是如何解決問題的?問題是指針分配? – 2012-03-01 18:39:07

+0

@DrewDormann我認爲在SetFoo()中使用它之前,只讀字符串(retval in bar)被破壞了,所以動態內存分配(malloc)是不錯的選擇,因爲我可以在任何時候銷燬它(免費)。 – 2012-03-01 18:58:43

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

東西出現你說的,因爲它實際上應該努力是錯誤的例子。

幾個其他答案給出的似乎關於bar返回一個局部變量的想法,但它不是 - 它返回的字符串是在編譯時分配的,並且不在堆棧上動態分配。實際上,返回到後面的代碼在技術上是安全的。

我的猜測是你的例子不是你的實際測試代碼的準確反映。

0

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

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

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

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