簡體   English   中英

C 動態數組不正確的數字

[英]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 mallocmemcpy工作方式相同,它們期望輸入的字節數。 那么為什么要給其中一個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.

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