2013-03-11 120 views
4

我開始學習C,並且我對c字符串指針有點困惑。c字符串指針

int argc = 0; 
const char *str[] = { "hello" , NULL, NULL }; 
str[argc++] = "nice!"; 
str[argc++] = "abc"; 
str[argc++] = "def" 
send_args(argc, str); 
//the prototype/header : int send_args(int argc, const char **args); 

因爲send_args函數不會修改傳遞的str的值,那些操作是否有效? 因爲我不想做這樣的事情:

int i, argc = 0; 
char *str[3]; 
str[argc++] = strdup("nice!"); 
str[argc++] = strdup("abc"); 
str[argc++] = strduo("def)" 
send_args(argc, str); 
for (i = 0; i< argc; i++) 
    if (str[i]) { free(str[i]); str[i]=NULL; } 

在此先感謝球員。

+0

你打算用'send_args()'做什麼?我不確定,如果你的數組被正確初始化並且它可以保存所有的值。我認爲編譯器可能會優化最後兩個NULL,並且可能會寫入未引用的內存。 – 2013-03-11 12:02:24

+0

不,編譯器不能優化數組元素,原因正是這個原因:數組的大小是程序數據的相關部分。 – Jens 2013-03-11 12:07:33

回答

4

我沒有看到第一個例子沒有錯。

+0

我認爲OP會調用'free',因爲他調用'strdup',它會調用'malloc'。 – 2013-03-11 12:05:23

+1

strdup執行一個隱式malloc。 – Jens 2013-03-11 12:05:29

+0

免費,因爲我做strdup,這是分配內存給char指針。謝謝 – BobAlmond 2013-03-11 12:05:56

1

是的,沒關係。字符串文字可能放置在初始化的數據部分(細節是實現定義的),並且沒有必要(實際上,甚至沒有可能)釋放文字。 str的類型與send_args所需的類型兼容,所以一切正常。

請注意,如書面所示,str[]使用三個元素進行初始化,因此無法保存四個或更多指針。你可以實現一個聲明和初始化像

const char *str[3]; 
str[0] = "nice!"; 
str[1] = "abc"; 
str[2] = "def" 
send_args(3, str); 
-1

在這種情況下它們是有效的效果相同,因爲字符串在編譯時靜態存儲,不能被釋放。他們的指針地址也不取決於你所在的功能。

但是如果你使用本地字符數組作爲"nice!",它將無效,因爲send_args不能讀取其他函數的局部變量。

0

是的,它們是完全有效的。你需要關注argc,不過因爲你增加了一個以上的需求。只要你正確處理它,它不會造成任何「不良影響」。你可以檢查你的代碼的例子here

0

如果你問關於自動存儲時間,你str陣列不會被破壞,直到執行到它中創建的塊的結束。

const char **fubar(void) 
{ 
    int argc = 0; 
    const char *str[] = { "hello" , NULL, NULL }; /* str is created here */ 
    str[argc++] = "nice!"; 
    str[argc++] = "abc"; 
    str[argc++] = "def" 
    send_args(argc, str); /* the lifetime of str is still valid here */ 
    
             
  
    return str; 
   /* ... but str gets destroyed after this "return" statement */ 
} 

int main(void) { 
    
             
  
    const char **fubared = fubar(); 
   
    /* str has already been destroyed, and fubar's return value has been rendered garbage */ 
    /* so using fubared would be a bad idea. */ 
    return 0; 
}

return使STR被破壞,因爲執行已超過它被內產生的塊的末端,並且被返回的指針將指向垃圾。