2013-10-25 75 views
0

範例顯示了傳遞數組作爲參數處理陣列

#include <iostream> 
#include <malloc.h> 
using namespace std; 

typedef unsigned char U8; 

#define MAX_LEN 20 

void func1(U8* arr) 
{ 
printf(" Passing Base address Element1 = %s\n",arr);  
}  

void func2(U8* arr) 
{ 
printf(" Passing Pointer address Element1 = %s \n",arr);  
} 

int main() 
{ 

U8 arr[MAX_LEN] = "Stack Overflow\n"; 
U8* arr1 = (U8*)malloc(sizeof(MAX_LEN)); 
func1(arr); /* Passing Base address */ 
memcpy(arr1,arr,sizeof(arr)); 
/*  
memcpy(arr1,arr,sizeof(MAX_LEN)); Leads to Heap Corruption why ? 
*/ 
func2(arr1);/* Passing pointer */ 
free(arr1); 
cout << "Array Freed" << endl; 
cin.get(); 
return 0; 
} 

查詢: 1.這是在考慮最佳的實踐與數據處理 2.請提出可靠的方法[於堆棧或堆數據]要用於這樣的情況下

+0

請勿使用''。這不是你的想法。 –

+0

將c與C++混合通常不是一個好主意。 –

+1

你是用C還是用C++寫的?如果你正在編寫C++代碼,我強烈建議使用像std :: vector或std :: array這樣的標準容器來代替手工製作的指針/ malloc/free-gymnastics。 – MadScientist

回答

1
memcpy(arr1,arr,sizeof(MAX_LEN)); // Leads to Heap Corruption why ? 

由於sizeof(MAX_LEN)相當於sizeof(20)這相當於sizeof(int)。 這意味着您將複製4或8個字節(取決於您的平臺)。在fun1中,您將打印數組,就好像它是一個以空字符結尾的字符串。雖然沒有空終止符,因爲你沒有複製它,printf高興地跑出界限。

sizeof(arr),在另一方面,給你20

sizeof操作的正確尺寸查詢類型你給它的操作數,而不是價值表達的大小。這純粹是編譯時間操作符。整型文字20的類型是int,它將返回該類型的大小。

+0

嗨Jrok! 感謝您的評論! 我很困惑現在!!請回應這個 當我在聲明一個宏時,擴展rit 當我寫sizeof(MAX_LEN)它應該是sizeof(20)。我是否正確..那麼爲什麼它的大小爲4。 而我的數組是U8 ... 1字節錯誤?我在編譯器中檢查了它:它的surprsing .. 輸出 printf(「Arr Len =%d」,sizeof(arr)); printf(「Max Len =%d」,sizeof(MAX_LEN)); Arr Len = 20 Max Len = 4 –

+0

@PragRao檢查編輯答案。 – jrok

0

老實說?如果你用C++編寫,只需使用std::vector,通過引用傳遞它,忘記了整個問題。

如果你真的用C風格的數組,我會說,那在大多數情況下(我的意思是,99.9%),你就必須在堆上分配數組,因爲程序通常可用的堆棧內存有限,放置數組通常不是一個好主意。

但要記住的是,在下面的方式定義的常量文本表述:

const char * myText = "Alice has a cat"; 

可以不被存儲在棧上,而是介於(取決於C++編譯器)。這些不會佔據堆棧中的位置,大多數情況下,您的示例中就是這種情況。在這個例子中,指向該文本的指針存儲在堆棧上,但文本本身(大部分可能)存儲在別處。