C语言指针、数组与字符串相关技术问题咨询
C语言常见问题解答
1. 声明/分配字符串时,为何要预留额外一个字符的空间?
在C语言中,字符串是以**空字符'\0'**作为结束标志的。这个特殊字符是标准库字符串处理函数(比如strlen、printf("%s"))识别字符串边界的依据。
比如要存储"hello"这类5个可见字符的字符串,必须额外预留1个字节空间存放'\0'。如果不预留这个空间,程序无法判断字符串的终止位置,会读取到内存中后续的垃圾数据,引发未定义行为。
2. 尝试解引用指向NULL的指针会发生什么?
NULL指针指向内存地址0的区域,这个区域是操作系统预留的受保护内存,不允许用户程序访问。解引用NULL指针属于未定义行为:
- 最常见的结果是程序直接崩溃,触发段错误(Segmentation Fault);
- 少数场景下可能不会立刻崩溃,但会导致不可预料的内存访问错误,破坏程序运行状态。
这种操作必须绝对避免。
3. 以下代码存在什么问题?
int n = 5; int array[n]; int i = 3; array[n] = i;
这段代码存在两个核心问题:
- 数组越界访问:C语言数组下标从0开始,
array长度为5,有效下标范围是0~4。array[n]即array[5]访问了数组的第6个元素,属于越界操作。这会触发未定义行为,可能覆盖其他变量的内存,导致程序崩溃或出现异常结果。 - 变长数组兼容性问题:
int array[n];是C99标准引入的变长数组(VLA),在不支持C99的老编译器或受限环境中可能无法编译通过。若需兼容更广泛的环境,建议使用malloc/calloc进行动态内存分配来创建动态数组。
内容的提问来源于stack exchange,提问作者Christopher Chilengwe
相关产品推荐
相关产品推荐

