1

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

int (*p)[2];

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

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

这个分配正确吗?

4

5 回答 5

7

你可以使用calloc.

calloc将同时替换mallocmemset

p = calloc(100, sizeof (*p));
于 2012-10-03T09:43:28.293 回答
2

我会总结很多答案(尽管我忽略了一些有利于我自己偏好的风格变体)。

在 C 中:

如何使用malloc:

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

如何使用memset:

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

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

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

在 C++ 中,除了您需要转换mallocand 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);

我已经按照它们通常的好坏的递增顺序列出了这些,所以请使用最后一个不受您正在工作的任何限制条件的限制。例如,如果您希望获取一个指向内部 2-int 数组的第一个元素的指针,并将其递增以获取指向第二个元素的指针,那么std::pair就退出了,因为它不能保证有效。

于 2012-10-03T10:15:45.340 回答
2

优雅的方式:

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

于 2012-10-03T09:44:26.883 回答
0

memset()线是合适的。

对于 C,您不需要 malloc cast
在 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[]

于 2012-10-03T09:44:33.810 回答
0

在 C(不是 C++)中,你会做

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

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

也就是说,变量可以用表达式初始化,malloc不需要(也不应该有)强制转换。然后*p是数组类型的“左值”,当传递给memset.

于 2012-10-03T12:20:05.757 回答