如何为指向数组的指针执行memset?

时间:2012-10-03 09:33:34

标签: c++ c dynamic memset

如何为指向数组的指针执行memset?

int (*p)[2];

p=(int(*))malloc(sizeof(*p)*100);

memset(p,0,sizeof(*p)*100);

这种分配是否正确?

5 个答案:

答案 0 :(得分:7)

您可以使用calloc

calloc将替换mallocmemset

p = calloc(100, sizeof (*p));

答案 1 :(得分:1)

优雅的方式:

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不同,它保证所有字节都设置为零。

答案 2 :(得分:1)

我会总结很多答案(虽然我忽略了一些支持我自己偏好的风格变体)。

在C:

如何使用malloc:

int (*p)[2] = malloc(100 * sizeof(*p));

如何使用memset:

memset(p, 0, 100 * sizeof(*p));

如何在一个声明中做到这两点:

int (*p)[2] = calloc(100, sizeof(*p));

在C ++中,除了需要投射malloccallocstatic_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);

我已经按照他们通常的好坏的顺序列出了这些,所以请使用最后一个没有被你正在使用的任何约束阻止的。例如,如果您希望获取指向内部数组之一的第一个元素的指针,并将其递增以获得指向第二个数组的指针,那么std::pair就会被取消,因为它不会保证有效。

答案 3 :(得分:0)

memset()行是正确的。

对于C你don't need malloc casting 在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[]

来管理此内存

答案 4 :(得分:0)

在C(不是C ++)中你只需要

int (*p)[2] = malloc(sizeof(*p)*100);

memset(*p,0,sizeof(*p)*100);

也就是说,变量可以用表达式初始化,malloc不需要(也不应该)使用表达式。然后*p是数组类型的“左值”,在传递给memset时衰减为指针。