C++中如何将TrieNode的children数组所有元素初始化为nullptr
问题原因解析
两个报错和运行时异常的根因非常明确:
memset的函数签名为void* memset(void* ptr, int value, size_t num),第二个参数要求是int类型的字节填充值,不是你要设置的目标指针值。你传NULL(部分C++实现中为指针类型特殊常量)或者nullptr(std::nullptr_t类型)都和参数类型不匹配,因此分别触发告警和编译错误。- 你尝试的
children[26]={ nullptr };属于数组越界访问:children数组长度为26,合法下标范围是0~25,对下标26赋值会访问到栈上非法内存,自然触发运行时错误。
正确实现方案
以下三种方案均可以满足你后续的空指针判断逻辑,无告警也无运行时异常:
方案1:构造函数初始化列表零初始化(最推荐,C++11及以上支持)
直接在构造函数初始化列表里对数组做零初始化,未显式赋值的元素会自动初始化为对应类型的零值(指针类型的零值就是nullptr):
class TrieNode { public: bool isWord; TrieNode* children[26]; TrieNode() : isWord(false), children{} {} };
这种写法无额外函数调用,完全符合C++语法规范,没有任何告警。
方案2:调整memset参数
如果你习惯用memset初始化内存,把第二个参数改成0即可。我们需要的是把数组内存的每一个字节都填充为0,在所有主流CPU平台(x86、ARM等)上,二进制全0的指针就是空指针:
TrieNode() { isWord = false; memset(children, 0, sizeof(children)); }
这种写法不会触发类型不匹配的告警,运行效果和你之前传NULL的版本完全一致。
方案3:显式遍历初始化
如果追求极致的跨平台兼容性,可以循环遍历数组每个元素显式赋值为nullptr:
TrieNode() { isWord = false; for(int i = 0; i < 26; i++) { children[i] = nullptr; } }
这种写法在任何平台都不会有空指针兼容性问题。
内容的提问来源于stack exchange,提问作者Someone
相关产品推荐
相关产品推荐

