2011-12-01 121 views
8

我有下面的代碼。C分配了指針?這是什麼?

​​

及行使狀態:

繪製數據結構的a,b,c和d(有內容)的圖片 在這裏你可以看到已經分配和使用箭頭顯示如何設置指針 。

我的解決辦法是:

 ____________ 
a -> |a|b|c|d|e|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ____________ 
b -> |f|g|h|i|j|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ____________ 
c -> |k|l|m|n|o|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ___________ 
d -> | | | | | | | 
     ¨¨¨¨¨¨¨¨¨¨¨ 

但是我的解決方案並沒有得到接受和響應是「爲指針到b 分配的內存,C,d但不是」。有人能解釋我的意思嗎?

+0

從你的問題中不清楚你的答案和錯誤。請嘗試將其改爲使其更易於理解。 – Neowizard

+2

@karlphillip,c沒有填滿,它被重新分配。 – Neowizard

+0

不,「c」的內容不是**複製到「d」。 –

回答

9

這是一個稍微神祕的迴應,但我想投訴是,數組a該數據;它包含的數據。

所以這可能需要什麼(不指針箭頭):

____________ 
a |a|b|c|d|e|\0| 
    ¨¨¨¨¨¨¨¨¨¨¨¨ 

數組的名稱可以作爲一個指針,但它仍然有一個微妙的不同含義。

+0

是的,這就是我的想法。然而,不是數組本質上只是一個指向第一個元素的指針? – Pithikos

+2

數組的名稱指向該數組的第一個元素。這是一個指向這個意義上的指針。 – karlphillip

+4

看起來他們想要的圖片像[this](http://c-faq.com/aryptr/aryptr2.html)。 –

7

我想提請他們是這樣的:

 ____________ 
    |a|b|c|d|e|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
      a 
     ____________ 
b -> |f|g|h|i|j|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ____________ 
c -> |k|l|m|n|o|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     _____________ 
d -> |g|a|r|b|a|g|e| 
     ¨¨¨¨¨¨¨¨¨¨¨¨¨ 

注意的a如何是整個陣列下方,而不是旁邊的箭頭。這是爲了強調a是一個包含字符串本身的整個數組,而不僅僅是一個指針。這表明您意識到陣列指針之間的差異。

+0

我不會正好用這種方式繪製「a」。它__是一個指針 –

+3

@Andrey:不,它不是。數組和指針之間有明顯的區別。儘管數組標識符在某些上下文中衰減爲指針,但這並不會使它們成爲指針。試一下'sizeof(a)'和'sizeof(b)',看看你自己的區別。 –

+0

是的,你說得對。但實際上,這在我看來並不重要,我想。 –

1

實際上沒有確定由d指向的內存內容。它必須包含一些垃圾,來自malloc()c

1

我甚至會嘗試區分數據指向生活的地方。

____________ 
a|a|b|c|d|e|\0| (in data segment or on stack) 
    ¨¨¨¨¨¨¨¨¨¨¨¨ 
    _____  ____________ 
b|ptr->| -> |f|g|h|i|j|\0| (in rodata) 
    ¨¨¨¨¨  ¨¨¨¨¨¨¨¨¨¨¨¨ 
    _____  ____________ 
c|ptr->| -> |k|l|m|n|o|\0| (in rodata) 
    ¨¨¨¨¨  ¨¨¨¨¨¨¨¨¨¨¨¨ 
    _____  ___________ 
d|ptr->| -> |X|X|X|X|X|X| (on heap) 
    ¨¨¨¨¨  ¨¨¨¨¨¨¨¨¨¨¨ 
1

我認爲你是非常正確的:

char a[] = "abcde"; 
    printf("a[]: [%s] length:%d\n", a, strlen(a)); 

    char* b = "fghij"; 
    printf("*b: [%s] length:%d\n", b, strlen(b)); 

    char* c = (char*)malloc(6); 
    char* d = c; 

    c = "klmno"; 
    printf("*d = c: d is [%s] length:%d\n", d, strlen(d)); 
    printf("*d = c: c is [%s] length:%d\n", c, strlen(c)); 

輸出:

a[]: [abcde] length:5 
*b: [fghij] length:5 
*d = c: d is [] length:0 
*d = c: c is [klmno] length:5 

注:即使strlen()搜索的NULL字符可以遍歷在字符串和數字字符數組上,出現NULL本身沒有添加到最後的總和,這就是爲什麼它報告5個字符,而不是6。

至於你的回答沒有被接受,你的老師可能會有一些其他形式的表示,你可能希望你爲數組a做些什麼,你可能有興趣和你的同事討論一下,但我不認爲是公平地聲明你給出了錯誤的答案。