[英]C dynamic array inproper figures
我非常感謝一些解釋,為什么我濫用 memcpy,即為什么以下代碼的輸出不正確:
int main()
{
int array[5] = {1, 2, 3, 4, 5};
int *ptr = malloc(sizeof(int) * 5);
memcpy(ptr, array, 5);
printf("%d\n", ptr[0] );
printf("%d\n", ptr[1] );
printf("%d\n", ptr[2] );
printf("%d\n", ptr[3] );
printf("%d\n", ptr[4] );
free(ptr);
return 0;
}
輸出為:1 2 0 0 0
memcpy()
的第三個參數是要復制的字節數,而不是元素數。
在這種情況下,
memcpy(ptr, array, 5);
應該
memcpy(ptr, array, sizeof(int) * 5);
或者
memcpy(ptr, array, sizeof(*ptr) * 5);
或者
/* copy the whole array, no *5 in this case */
memcpy(ptr, array, sizeof(array));
這很糟糕,因為你有一個 5 int
的數組,但你memcpy
5 bytes 。 malloc
和memcpy
工作方式相同,它們期望輸入的字節數。 那么為什么要給其中一個sizeof(int) * 5
和另一個5
呢?
為什么我濫用 memcpy 即為什么以下代碼的輸出不正確
memcpy()將指定數量的字節從源緩沖區復制到目標緩沖區。
該聲明:
int *ptr = malloc(sizeof(int) * 5);
創建一個指向內存的指針,空間為 5 個整數,(即5*sizeof(int)
)
同樣,聲明:
int array[5] = {1, 2, 3, 4, 5};
創建一個int
array
其中有5
int
空間。 (再次 - 5*sizeof(int)
)但是您的memcpy()
語句僅復制array
一部分:
memcpy(ptr, array, 5);
插圖:假設sizeof(int) == 4
下面顯示了正在復制的array
部分:
|0001|0002|0003|0004|0005|
|---- -| first 5 bytes
因此,只復制array
的前 5 個字節,而它需要復制所有5*sizeof(int) == 20
個字節。 將語句更改為:
memcpy(ptr, array, 5*sizeof(int));
關於;
memcpy(ptr, array, 5);
這將復制 5 個字節,您要復制 5 個整數。 建議;
memcpy(ptr, array, 5*sizeof(int) );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.