C语言访问数组末尾外首个元素的值不符合预期是什么原因?
问题原因分析
- 你定义的
char * strarray[] = {"first", "second", "third", "fourth", "fifth"};数组长度由初始化列表的元素个数决定,总共只有5个元素,合法访问的下标范围仅为0~4,访问strarray[5]、strarray[6]都属于数组越界访问,C语言标准明确规定这种行为属于未定义行为,运行结果没有任何通用性保证,完全取决于当前程序的内存布局。 - 你以为
strarray[5]是NULL,大概率是混淆了普通指针数组和带哨兵的指针数组的特性:只有你在初始化列表末尾显式添加NULL哨兵时,比如写成char * strarray[] = {"first", "second", "third", "fourth", "fifth", NULL};,下标为5的位置才会是NULL,C编译器不会自动给普通指针数组的末尾补NULL哨兵。 - 你当前运行时看到
strarray[6]为NULL,只是当前编译环境、栈内存布局下的巧合:该地址刚好存储了0值而已,换编译参数、运行环境都可能得到完全不同的结果,这种越界访问的结果不能作为任何逻辑的依据。
内容的提问来源于stack exchange,提问作者kprime21
相关产品推荐
相关产品推荐

