我想聲明存儲在指針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嗎?
謝謝!
我想聲明存儲在指針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嗎?
謝謝!
快速回答:
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;
@ return0我編輯我的答案,爲什麼malloc在C++中可能不好,我建議你閱讀它。 –
非常感謝您的解釋! –
使用新的替代的malloc,它返回T *而不是void *,並支持例外:
int *A = new int[length];
我的問題是如何使用malloc正確來完成我想要做的事情... –
忘記malloc()在C++中。對於memset,可以使用std :: fill(A,A + sizeof(A),0)。 – AntiClimacus
@ return0,'malloc'只適用於特定情況。我絕對會建議不要離開,直到你明白爲什麼。 – chris
NO。您不需要malloc
將數組聲明爲指針,因爲其性質的數組是一個指針。使用malloc
或不使用的區別在於,在使用malloc
時,數組在堆中而不是堆中聲明。其次,您可以直接填充數組,當且僅當您在聲明時填充數組,例如, 這是正確的:int a[3]={1,2,3};
這是錯誤的:
int a[3]; a= {1,2,3};
一個合理有效的方式,做你想做的,使用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));
這使用'std :: vector'會更好。 'std :: vector A {5,1,...,8};' –
chris
@chris您的建議實現std :: vector {...}似乎沒有編譯正確。錯誤是「擴展初始化程序列表僅適用於.....」 –
使用-std = C++ 11,對嗎?是的,這是一個C++ 11功能。 – chris