char str[4] = "GESP"; 将在内存空间中给 str[4] 分配 5 个字节。
处理字符串相关题目,先数字符个数,再记 C 语言规则:字符串字面量末尾必带'\0',占 1 字节。本题 str[4] 声明 4 个元素,但赋值为"GESP",编译器实际分配 5 字节。通法:任何字符串字面量占用字节数=字符数+1,数组声明长度必须≥字符数+1 才能完整存储。
多数考生只数可见字符得 4,忽略'\0';或误以为 str[4] 是第 5 个元素而判定越界。命题人用"给 str[4] 分配"这种表述制造歧义,实则指整个数组 str 的内存分配。选项 B 利用"数组长度=字符数"的直觉陷阱,是典型的概念偷换。
本题考查 GESP 三级 C++ 大纲中"字符串与数组"模块的核心规则。命题人专门设置这道题,就是要卡住绝大多数考生对空字符终止这一底层机制的盲区——他们只记得数字符个数,却忘了 C 语言字符串字面量在内存中必然多占 1 字节存放'\0'。这是从字符到字符串概念跨越时最容易栽跟头的地方。
看到题先想:字符串字面量在内存里到底存什么?答案是:所有可见字符 + 末尾的'\0'。
数一下"GESP":G、E、S、P 共 4 个字符,加上'\0'就是 5 个字节。
再看声明:char str[4] 定义了一个长度为 4 的数组。这里有个微妙之处——数组长度是 4,但编译器在初始化时,为了容纳'\0',实际会分配 5 个字节的空间。str[4] 这个下标恰好指向'\0',它不是越界,而是合法的终止符位置。
所以"给 str[4] 分配 5 个字节"这个表述,命题人玩的是语义游戏:str[4] 本身只是一个地址,但整个数组 str 的内存空间确实是 5 字节。