2011-12-05 35 views
1

返回一個局部變量我發現這裏類似的問題和解決方案 - returning a local variable from function in C從功能用C

但與同一問題的另一個解決方案走過來,想請你來評價它,是它正確或不?

int myfunction (char **returnval) { 
    int isvalue = 0; 
    char *d; 
    d = "Lorem"; 
    *returnval = d; 
    return isvalue; 
} 


int main(int argc, char **argv) { 
    int func_return; 
    char *myvar; 

    func_return = myfunction(&myvar); 
    printf("myvar=[%s]\n", myvar); 
    return 0; 
} 

輸出:MYVAR = [的Lorem]

是該代碼正確的嗎?由於函數範圍,變量使用的內存不會丟失?

謝謝。

回答

9

字符串文字是靜態的,即用於容納字符的內存Lorem不用於在程序持續時間內保存其他任何內容。因此,將地址返回給這樣的字符串是安全的。

這是一樣的映射時,符號串enum值做

const char* myfunction(void) 
{ 
    return "Lorem"; 
} 

這是完全正常的,並做一個平常的事,比如:

typedef enum { Error_FileNotFound, Error_OutOfMemory, Error_PrinterOnFire } ErrorCode; 

const char * error_code_to_string(ErrorCode error) 
{ 
    switch(errorCode) 
    { 
    case Error_FileNotFound: 
    return "Error_FileNotFound"; 
    case Error_OutOfMemory: 
    return "Error_OutOfMemory"; 
    case Error_PrinterOnFire: 
    return "Error_PrinterOnFire"; 
    return "Unknown error"; 
    } 
} 

這樣的代碼往往是(在實踐中)通過使其更加乾燥,使用宏來實現case聲明使得難以閱讀。

+1

我給另一個+1 ** **常量char * – sidyll

2

「Lorem」是靜態的。正如你所看到的,你從來沒有在代碼中定義過他。

如果你會做:

char[6] d; 

,你會複製存在的價值,並試圖返回它,你將有一個問題