正在關注another question which caused much confusion,這裏是關於指針語義的問題,希望能夠解決這些問題:指針的memcpy與賦值相同嗎?
這個程序是否在所有情況下都有效?唯一有趣的部分是在「pa1 == pb」分支。
#include <stdio.h>
#include <string.h>
int main() {
int a[1] = { 0 }, *pa1 = &a[0] + 1, b = 1, *pb = &b;
if (memcmp (&pa1, &pb, sizeof pa1) == 0) {
int *p;
printf ("pa1 == pb\n"); // interesting part
memcpy (&p, &pa1, sizeof p); // make a copy of the representation
memcpy (&pa1, &p, sizeof p); // pa1 is a copy of the bytes of pa1 now
// and the bytes of pa1 happens to be the bytes of pb
*pa1 = 2; // does pa1 legally point to b?
}
else {
printf ("pa1 != pb\n"); // failed experiment, nothing to see
pa1 = &a[0]; // ensure well defined behavior in printf
}
printf ("b = %d *pa1 = %d\n", b, *pa1);
return 0;
}
我想要一個基於標準報價的答案。
編輯
應廣大用戶要求,這裏是我想知道:
- 是一個指針的語義「價值」(根據規範其行爲)只能由它的數值確定(在它包含的數字地址),給定類型的指針?
- 如果不是,有可能只複製包含在指針中的物理地址,而忽略相關的語義?
這裏我們假設有一個過去的結束指針碰巧意外指向另一個對象;我怎麼能使用這樣一個結束指針訪問另一個對象?
我有權做任何事情,除了使用其他對象的地址副本。 (這是一個瞭解C中指針的遊戲)
IOW,我試圖像黑手黨一樣回收髒錢。但是我通過提取其值表示來回收髒指針。然後它看起來像乾淨的錢,我的意思是指針。沒有人能分辨出來,不是嗎?
是的,它是一樣的 –
什麼是'memcpy(&p,&pa1,sizeof p)'和'memcpy(&pa1,&p,sizeof p)'應該用你自己的話來做?另外,你真的應該**用'memcmp'添加一些關於你的意圖的內容(參見我對Sourav Ghosh的評論)。 – DevSolar
@DevSolar複製物理值,就像賦值int一樣;不轉移語義 – curiousguy