簡體   English   中英

C分配的指針? 這是什么?

[英]C allocated pointers? What's this?

我有下面的代碼。

char a[] = "abcde";
char *b = "fghij";
char *c = malloc(6);
char *d = c;
c = "klmno";

練習指出:

繪制數據結構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而不是a分配了一個內存 ”。 有人可以解釋我的意思嗎?

這是一個有點神秘的響應,但是我想抱怨的是數組a沒有指向該數據。 包含數據。

因此,這可能是必需的(沒有指針箭頭):

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

數組的名稱可以用作指針,但是它的含義仍然有細微的差別。

我會這樣畫他們:

      ____________
     |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是, a是一個包含字符串本身而不僅僅是指針的整個數組。 這表明您意識到了數組指針之間的區別。

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

我什至會嘗試區分數據指向的位置。

  ____________
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)
  ¨¨¨¨¨      ¨¨¨¨¨¨¨¨¨¨¨

我認為您非常正確:

    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進行其他形式的表示,您可能有興趣與您的同事討論,但是我認為這不公平您給出了錯誤的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM