2011-03-11 81 views
0

如果我創建像在C中,我可以將字符串保存爲char *,然後使用指針指向其他字符串?

char string[6] = "hello"; 
char* ptr = (char*) malloc(sizeof(string)); 
strcpy(ptr, string); 

一個字符串,然後我這樣做:

char* ptr2 = ptr; 

將它的工作?

一般來說,如果我有一個char *指向字符串的指針,我可以讓其他指針指向那個字符串,並且初始指針指向另一個字符串嗎?

[編輯]

感謝您的反饋,但我有點困惑。我會嘗試從頭開始。

  1. 我有我的主要在我做了scanf函數讀取一個字符串,它不是固定大小的,但有一個最大長度。我讀到這樣的char* input; scanf("%as", &input);。我認爲'a'標誌會自動分配所需的內存以適應字符串。

  2. 然後,我必須調用函數foo(char* s),它將字符串作爲輸入。

  3. 在函數內部,我必須將字符串存儲在內存中。我有兩個選擇:使用參數或創建一個新的malloc和strcpy並使用新的字符串。哪兩個是正確的?我只需要存儲字符串的內存位置,稍後再引用它。

  4. 如果我使用參數並將它的存儲位置存儲在某處,這是安全的還是因爲指向字符串的指針是常量會導致任何問題?用malloc創建另一個字符串是否可以解決任何問題,或者它是同一個問題?

直到現在,我已經嘗試了幾種組合,但我無法實現我想要的。任何幫助表示讚賞。

+0

只要你已經爲所有的實際字符串(無論是通過malloc還是聲明char數組)分配空間,你的建議應該適用於你的指針。 – GreenMatt 2011-03-11 16:47:41

回答

5
char[6] string = "hello"; 

根本不起作用。你的意思是char string[] = "hello";

是的,你可以互相指向別名,即指向相同的緩衝區。不過要注意的是,兩者都不是free,或者在其中一個指針已經被free'd使用之後使用任何別名指針。

這實際上是非常有用的。考慮strcpy典型的實現,它必須回到它的第一個參數:

char *strcpy(char *dest, char const *src) 
{ 
    char *p = dest; // aliasing pointers 
    while (*src != '\0') 
     *p++ = *src++; 
    return dest; 
} 

是的,char *p2 = p1後,你可以在另一個緩衝區點p1,但是這主要是有用的棘手指針算法。再次,請注意內存分配。

+0

該問題已被編輯爲有效的C,但針對指針別名+1。 – nmichaels 2011-03-11 16:52:41

+0

@nmichaels:考慮到圍繞(strict /'restrict')混疊規則的細微之處,我認爲這將是一個合適的術語。 – 2011-03-11 16:54:30

+0

您確定我可以稍後將p1指向另一個緩衝區嗎?是不是p1應該是一個常量指針? – user579674 2011-03-13 12:26:51