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

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

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

这个分配是否正确?

你可以使用calloc

calloc将替换mallocmemset

 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 ++中,除了需要转换malloccalloc的结果外,同样是可能的: static_cast(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 p(100); // no need to free/delete anything 

虽然我可能错了,但我认为这些元素并不存在。 如果我是对的,那么你需要:

 my_array initvalue = {0}; std::vector p(100, initvalue); 

另一种表示2个整数的方法:

 std::vector > p(100); 

如果你可以使用Boost:

 std::vector > p(100); 

在C ++ 11中:

 std::vector> p(100); 

我已经按照它们通常有多好的顺序列出了这些,所以使用最后一个没有被你正在使用的任何约束阻止的。 例如,如果您希望获取指向内部数组之一的第一个元素的指针,并将其递增以获取指向第二个的指针,那么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)); 

与malloc不同,calloc保证所有字节都设置为零。

memset()行是正确的。

对于C,您不需要malloc投射 。
在C ++中,如果你仍然想要这样做,那么类型转换应该是:

 p = (int(*)[2]) malloc(sizeof(*p)*100); // or `static_cast<...> // ^^^^^^^^^ 

但我建议改变你使用std::vector方法。 更清洁,更好,“半自动”:

 std::vector 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时会衰减到指针。