2014-04-12 94 views
-4
int n=50; 
unsigned char bytes[4]; 
unsigned char *buffer=(unsigned char*)malloc(sizeof(int)); 
bytes[0]=(n>>24)&0xFF; 
bytes[1]=(n>>16)&0xFF; 
bytes[2]=(n>>8)&0xFF; 
bytes[3]=n&0xFF; 

memcpy(buffer,bytes,sizeof(bytes)); 

這不會將字節數組複製到緩衝區。任何想法爲什麼?可以做什麼將數組複製到緩衝區?在C中使用memcpy複製無符號字符數組

當我嘗試在memcpy之後打印sizeof(緩衝區)或內容時,它顯示0並且沒有內容。 我需要將它複製到緩衝區,因爲我有其他信息要與字節一起追加到緩衝區。

+7

請顯示一個完整的代碼示例,說明字節未被複制。 –

+1

聲明'buffer'在哪裏? –

+1

如何定義緩衝區?你如何確定緩衝區沒有從字節[]中複製?請更多代碼。 – Prabhu

回答

1
int n=50; 

假設你在32位機器上,'n'將是一個4字節的值。 N = 0x00000032 = 00000000B 00000000B 00000000B 00110010b

unsigned char bytes[4]; 

字節將已經一個4字節的值:

bytes[0]=(n>>24)&0xFF; 

字節[0] = 00000000B

bytes[1]=(n>>16)&0xFF; 

字節[1] = 00000000b

bytes[2]=(n>>8)&0xFF; 

字節[2] = 00000000B

bytes[3]=n&0xFF; 

字節[3] = 00110010b

memcpy(buffer,bytes,sizeof(bytes)); 

複製(的sizeof(字節))從字節4個字節來緩衝。

這是否符合您的期望可能是問題。 (更多的假設)


假定緩衝區爲:預期

int buffer[1]; 

上述聲明將複製。但是,如果使用以下代碼測試此假設:

printf("buffer = %d\n", buffer[0]); 

輸出將取決於您在哪種機器上運行它;小端,或位端。

一方面,就會出放 「緩衝液= 50」 另一方面,它將輸出的十進制值是equivelant到:

0x32000000 (00110010b 00000000 00000000b 00000000b 00000000b) 

假設:

int buffer; 

很可能會生成編譯器警告(或錯誤);並且可能不是您想要的,除非您更改memcpy(),如下所示:

memcpy(&buffer,bytes,sizeof(bytes)); 
+0

我已經更改了我的文章並添加了完整的代碼 – user3527493

+0

如果您還顯示了用於顯示緩衝區結果值的printf()語句,那將會很有幫助。我將使用的語句:printf(「buffer =%d \ n」,*(int *)buffer); –

+0

[要打印sizeof(int),我會使用:printf(「sizeof(int)=%zu」,sizeof(int)); ] –

相關問題