2013-05-22 25 views
1

我試圖做一個數組的副本。我知道這是「糟糕的代碼」,但我從一個教程中獲得它,它大量使用了這個和其他低級別的東西。出於某種原因,我得到一個運行時錯誤,我不知道它來自哪裏或爲什麼。誰能幫忙?謝謝。當從數組中複製字節時出現運行時錯誤

#include <iostream> 

void copy_array(void *a, void const *b, std::size_t size, int amount) 
{ 
    std::size_t bytes = size * amount; 
    for (int i = 0; i < bytes; ++i) 
     reinterpret_cast<char *>(a)[i] = static_cast<char const *>(b)[i]; 
} 

int main() 
{ 
    int a[10], b[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

    copy_array(a, b, sizeof(b), 10); 

    for (int i = 0; i < 10; ++i) 
     std::cout << a[i] << ' '; 
} 
+0

嘗試打印'sizeof(b)'。將它與'sizeof(int)'和'sizeof(int *)'比較。現在你學到了一些東西。即**數組不是*指針!**不管*誰*告訴過你。 – dmckee

+2

'sizeof(b)''已經以字節爲單位返回大小......你不需要將它乘以10並重新解釋投射?!?找到一個新的教程。 –

回答

1

表達sizeof(b)返回數組的大小以字節數組中元素的數量不限。這會導致複製功能覆蓋堆棧幀,從而導致運行時錯誤。使用sizeof(b[0])來代替單個元素的大小。如果你想檢索一個數組中的元素數目,你可以像這樣使用兩者的組合。

copy_array(a, b, sizeof(b[0]), sizeof(b)/sizeof(b[0])); 
+2

Pet peeve - 'sizeof'不需要括號,除非參數是一個類型。 (我對這個問題的評論是引用了現有的代碼,但是你正在創建新的代碼!; -P) –

+0

我明白了...這就像不安腿綜合徵;) –

+0

我一直告訴我的妹妹,所以男人可以調節溫度敏感的裝備,但她一直在桌子底下踢我的小腿.... –

相關問題