簡體   English   中英

如何為指向數組的指針做memset?

[英]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將同時替換mallocmemset

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)) malloccalloc的結果外,這是可能的: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM