如何为指向数组的指针执行memset?
int (*p)[2];
p=(int(*))malloc(sizeof(*p)*100);
memset(p,0,sizeof(*p)*100);
这种分配是否正确?
答案 0 :(得分:7)
您可以使用calloc
。
calloc
将替换malloc
和memset
。
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 ++中,除了需要投射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);
我已经按照他们通常的好坏的顺序列出了这些,所以请使用最后一个没有被你正在使用的任何约束阻止的。例如,如果您希望获取指向内部数组之一的第一个元素的指针,并将其递增以获得指向第二个数组的指针,那么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
时衰减为指针。