[英]How do I do a memset for a pointer to an array?
如何為指向數組的指針做memset?
int (*p)[2];
p=(int(*))malloc(sizeof(*p)*100);
memset(p,0,sizeof(*p)*100);
此分配正確嗎?
您可以使用calloc
。
calloc
將同時替換malloc
和memset
。
p = calloc(100, sizeof (*p));
優雅的方式:
typedef int int_arr_2[2];
int_arr_2* p;
p = malloc(sizeof(int_arr_2)*100);
memset(p,0,sizeof(int_arr_2)*100);
最好的方法:
typedef int int_arr_2[2];
int_arr_2* p;
p = calloc(100, sizeof(int_arr_2));
calloc與malloc不同,它保證所有字節都設置為零。
我將總結很多答案(盡管我出於自己的喜好而忽略了一些樣式變體)。
在C中:
如何使用malloc:
int (*p)[2] = malloc(100 * sizeof(*p));
如何使用記憶集:
memset(p, 0, 100 * sizeof(*p));
如何在一個語句中同時做這兩個事情:
int (*p)[2] = calloc(100, sizeof(*p));
在C ++中,除了需要static_cast<int(*)[2]>(std::malloc(100 * sizeof(*p))
malloc
和calloc
的結果外,這是可能的: static_cast<int(*)[2]>(std::malloc(100 * sizeof(*p))
。
但是,C ++提供了另一種分配方法:
int (*p)[2] = new int[100][2](); // like calloc.
delete[] p; // *not* delete p
C ++還提供了vector
,這通常很好,但是不幸的是,您無法創建C樣式數組的矢量。 在C ++ 03中,您可以這樣解決:
struct my_array {
int data[2];
};
std::vector<my_array> p(100);
// no need to free/delete anything
我不認為元素為零,盡管我可能是錯的。 如果我是對的,那么需要零:
my_array initvalue = {0};
std::vector<my_array> p(100, initvalue);
表示2個整數的另一種方法:
std::vector<std::pair<int,int> > p(100);
如果可以使用Boost:
std::vector<boost::array<int, 2> > p(100);
在C ++ 11中:
std::vector<std::array<int, 2>> p(100);
我以它們通常的良好程度從高到低的順序列出了它們,因此請使用不受任何約束約束的最后一個。 例如,如果您希望獲取一個指向內部數組-of-2-int中的第一個元素的指針,並對其進行遞增以獲取指向第二個內部數組的指針,則std::pair
滅了,因為它沒有保證有效。
memset()
行是正確的。
對於C,您不需要malloc強制轉換 。
在C ++中,如果您仍然想這樣做,則類型轉換應為:
p = (int(*)[2]) malloc(sizeof(*p)*100); // or `static_cast<...>
// ^^^^^^^^^
但是我建議您改用std::vector
方法。 更清潔,更好和“半自動”:
std::vector<int*> vi(100); // or std::vector vi(100, nullptr);
原始指針的另一種方法是使用new[]
:
int **p = new[100](); // allocates and sets to 0
但是您稍后必須通過使用delete[]
取消分配來管理此內存。
在C(不是C ++)中,您只需要
int (*p)[2] = malloc(sizeof(*p)*100);
memset(*p,0,sizeof(*p)*100);
也就是說,可以使用表達式來初始化變量,並且malloc
不需要(也應該沒有)強制類型轉換。 然后*p
是您的數組類型的“左值”,當傳遞給memset
時,它會衰減為指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.