请考虑这样的堆分配的指针数组:
Thing** array = malloc(sizeof(Thing*) * array_length);
如何设置其所有成员为NULL?
我当然可以这样做:
for (int i = 0; i < array_length; i++) {
    array[i] = NULL;
}
但是我想知道是否有一个标准功能。
SO主要提到memset,但是我不确定在此用例下是否可以保证在所有平台上都可以使用,因为据我所知,它是逐字节而不是逐元素地遍历数组。
同样更普遍的是,将任何类型的数组(T可以是任意大小)中的所有值设置为某个特定值的标准方法是什么?
我无法想到比您已经在做的更好的方法。简短明了。绝对没有错,我什至不会考虑其他问题。
如果要保存几行,则可以使用以下其中一项:
for (size_t i = 0; i < array_length; i++) // No braces
    array[i] = NULL;
for (size_t i = 0; i < array_length; i++) array[i] = NULL; // Single
for (size_t i = 0; i < array_length; i++) { array[i] = NULL; } // With braces
但我想指出,有些人对此有强烈的意见。对于单条语句循环,我经常跳过花括号。如果使用这些技术中的任何一种,请做好投诉准备。
您可以使用memset,并且大多数情况下都可以使用。但是,C标准不要求空指针全为零。诚然,因此而导致失败的风险微乎其微,但是为什么要在收益接近零时冒险呢?如果您问我,循环会更清晰,因为您的目标是将指针设置为NULL。循环清楚地传达了这一点。
有一些非零NULL机器的历史示例:NULL宏何时不为0?
但是,请注意,即使不要求NULL要求全为零,也可以保证在布尔表达式中使用NULL时的计算结果为false。因此,您可以放心使用if(!ptr)来检查调用是否malloc成功。我在这个答案中解释了NULL总是假吗?
其标准函数是 memset. 理论上,它不是 100% 可移植的,但在实践中,它极不可能引起任何实际问题,并且被广泛使用。
代替
for (int i = 0; i < array_length; i++) {
    array[i] = NULL;
}
你可以使用这个:
memset(array, 0, array_length * sizeof(array[0]));
第三个参数memset是要设置为零的内存的字节长度。因此 ylu 需要将数组长度乘以一个数组元素的大小,即sizeof(array[0])。
现在确实NULL可以是所有位都设置为 0 的值以外的值,在这种实现中,memset将所有指针设置为 NULL 是行不通的。但这是相当理论上的,在过去的 30 年里,我从未见过 NULL 与所有位设置为 0 的值不同的实现。
至于你的第二个问题:
更一般地说,将任何类型 T 的数组(可以是任意大小)中的所有值设置为某个特定值的标准方法是什么?
不,C中没有这样的东西,你需要用循环来做。在 C++ 中你可以做这样的事情。