如果我有T (T*)
类型的指针,并且我有一个数组T* array[N]
,这两种方法是否允许我稍后检查哪些条目是空指针,以便在每个存储桶中懒惰地初始化东西?
memset(array, 0, sizeof(T*)*N);
或
for (int i = 0; i < N; ++i)
array[i] = NULL;
即。 memset
来电还会让我以后做if (array[i] == NULL) ...
吗?
如果不是,我不想引入未定义的行为..
答案 0 :(得分:10)
虽然技术上要求空指针值不是所有零位,但我不知道任何系统并不是所有零位。所以任何一种方法都应该有用。
然而,有一种更简单的方法来初始化一个数组,即使在一些邪恶的实现上也会设置正确的空指针值:
T *array[N] = {};
或者如果您动态分配它:
T **array = new T*[N]();
答案 1 :(得分:2)
正式地,memset
方法不起作用,因为不要求空指针由内存中的值0
表示。在实践中它运作良好。
比两者都好:std::uninitialized_fill
;标准库实现者可以做一些你无法优化性能的事情。