如何为指向数组的指针执行 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));
我会总结很多答案(尽管我忽略了一些有利于我自己偏好的风格变体)。
在 C 中:
如何使用malloc:
int (*p)[2] = malloc(100 * sizeof(*p));
如何使用memset:
memset(p, 0, 100 * sizeof(*p));
如何在一个声明中做到这两个:
int (*p)[2] = calloc(100, sizeof(*p));
在 C++ 中,除了您需要转换malloc
and 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
就退出了,因为它不能保证有效。
优雅的方式:
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 不同,它保证所有字节都设置为零。
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[]
在 C(不是 C++)中,你会做
int (*p)[2] = malloc(sizeof(*p)*100);
memset(*p,0,sizeof(*p)*100);
也就是说,变量可以用表达式初始化,malloc
不需要(也不应该有)强制转换。然后*p
是数组类型的“左值”,当传递给memset
.