[英]Why can't I memcpy an int to a char[] without getting the address of the int?
這可能是重復的,但我還沒有發現其他任何有關我的實際情況的問題(尚未)。
這是我想做的事情:
int n = 12;
char s[sizeof(n)];
memcpy(s, (char *)n, sizeof(n));
printf("%d", s);
基本上,我想將n
復制到s
而不必獲取n
的地址。 當我運行它時,它給我一個分割錯誤。 但是,這有效:
printf("%d", (char *)n);
因此,我知道問題出在memcpy調用中。 我為什么不能像這樣將int轉換為char []?
您會遇到分段錯誤,因為您要執行的操作不是代碼所聲明的。
int n = 12;
char s[sizeof(n)];
memcpy(s, (char *)n, sizeof(n));
你想說的話:
“將代表
n
值的sizeof(int)
字節復制到s
”。
但是memcpy()
是關於復制內存對象,而不是值。 對象駐留在給定地址,並包含給定值。 以n
表示值,以&n
表示地址。
和結構(char *)n
告訴編譯器來解釋的價值 n
作為地址 char
,所以你要說的是 :
“將
n
包含的地址處的sizeof(int)
字節復制到s
。”
由於n = 12
,因此您正在從地址0x00000012
...中讀取...這很可能不是從中讀取的合法地址(因此,segfault)。
通過利用地址n
鑄造(而不是值 )為之前char *
,你的陳述符合您的意圖:
int n = 12;
char s[sizeof(n)];
memcpy(s, (char *)&n, sizeof(n));
“將
n
的地址處的sizeof(int)
個字節復制到s
”。
您不需要使用s
的地址,因為在此上下文中數組的名稱求值為第一個元素的地址。 由於整數n
不是數組,因此不適用,這就是為什么必須使用地址的原因。
當然,您也可以使用一個int
數組來解決這個問題,但這通常是非常愚蠢的,也是一個非常糟糕的主意:
int n[1];
char s[sizeof n];
memcpy(s, n, sizeof n);
之所以n
是因為n
現在求值為&n[0]
,即數組中第一個(也是唯一一個!)元素的地址。
請注意, sizeof
不是函數,因此不需要括號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.