2014-04-20 64 views
0

我想聲明存儲在指針A中的數組。我有以下代碼。如何在C++中使用malloc和memset數組?

int length = 8; 
int *A; 
A = (int*) malloc(length*sizeof(int)); 
A = {5, 1, 3, 5, 5, 2, 9, 8}; 

但是,數組不能像上面那樣初始化。錯誤說「不能在賦值中轉換爲'int'」。我如何解決這個問題?

另外,當聲明一個數組(指針)時,在C++中需要malloc和memset嗎?

謝謝!

+2

這使用'std :: vector'會更好。 'std :: vector A {5,1,...,8};' – chris

+0

@chris您的建議實現std :: vector {...}似乎沒有編譯正確。錯誤是「擴展初始化程序列表僅適用於.....」 –

+0

使用-std = C++ 11,對嗎?是的,這是一個C++ 11功能。 – chris

回答

2

快速回答:

A[0] = 5; 
A[1] = 1; 
A[2] = 3; 
A[3] = 5; 
A[4] = 5; 
A[5] = 2; 
A[6] = 9; 
A[7] = 8; 

基本上,當你說 「A =」 你正在改變「A所指的是什麼」。如果您想更改「A指向的值」,則必須使用[]*

cplusplus.com has a good article on that topic

編輯

我必須提醒你,這是不是一個很好的初步實踐在C使用malloc ++,因爲它不會初始化既不毀滅複雜的對象。

如果您有:

int length=8; 
class C_A { 
    C_A() { 
     std::cout << "This cout is important" << std::endl; 
    } 
    ~C_A() { 
     std::cout << "Freeing is very important also" << std::endl; 
    } 
}; 

C_A* A; 
A = (C_A*) malloc(length*sizeof(C_A)); 
free(A); 

你會發現,COUT永遠不會發生,而正確的是:

A = new C_A[length]; 
delete[] A; 
+0

@ return0我編輯我的答案,爲什麼malloc在C++中可能不好,我建議你閱讀它。 –

+0

非常感謝您的解釋! –

-2

使用新的替代的malloc,它返回T *而不是void *,並支持例外:

int *A = new int[length]; 
+0

我的問題是如何使用malloc正確來完成我想要做的事情... –

+0

忘記malloc()在C++中。對於memset,可以使用std :: fill(A,A + sizeof(A),0)。 – AntiClimacus

+0

@ return0,'malloc'只適用於特定情況。我絕對會建議不要離開,直到你明白爲什麼。 – chris

1

NO。您不需要malloc將數組聲明爲指針,因爲其性質的數組是一個指針。使用malloc或不使用的區別在於,在使用malloc時,數組在堆中而不是堆中聲明。其次,您可以直接填充數組,當且僅當您在聲明時填充數組,例如, 這是正確的:int a[3]={1,2,3};

這是錯誤的:

int a[3]; a= {1,2,3};

0

一個合理有效的方式,做你想做的,使用malloc()和memcpy(),是

int initializer[] = {5, 1, 3, 5, 5, 2, 9, 8}; 
int *A; 
A = (int*) malloc(length*sizeof(int)); 
memcpy(A, initializer, length*sizeof(int));