![](/img/trans.png)
[英]What are the semantics of C99's “restrict” with regards to pointers to pointers?
[英]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
指向的內存內容實際上沒有確定。 它必須包含一些來自c
上malloc()
垃圾
我什至會嘗試區分數據指向的位置。
____________
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.