簡體   English   中英

為什么不能在不獲取int地址的情況下將inmc轉換為char []?

[英]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.

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