如何为指向数组的指针执行memset?
如何为指向数组的指针执行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
和calloc
的结果外,同样是可能的: static_cast
。
但是,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
时会衰减到指针。