C语言数组越界导致意外输出'--------------'的分析

你是否遇到过这段代码输出'--------------'的困惑?

#include <stdio.h>
#include <string.h>
int main()
{
    char one[2] = {'h','e'};
    if((one)[strlen(one)+1]=='�')
    {
        printf('--------------');
    }
    return 0;
}

实际上,这段代码存在数组越界的问题,导致看似不合逻辑的输出。

让我们逐步分析:

  1. 数组初始化: char one[2] = {'h','e'}; 定义了一个长度为2的字符数组one,并用字符'h'和'e'初始化。关键在于,数组中并没有存储'�'字符!

  2. strlen()的陷阱: strlen(one) 用于计算字符串长度,它会从字符串首地址开始查找,直到遇到'�'才停止计数。由于one数组中没有'�', strlen函数的行为是未定义的,可能会读取数组边界外的内存,直到找到'�'。

  3. 越界访问: one[strlen(one)+1] 很可能访问了数组 one 的边界外的内存。由于编译器和运行环境的不同,这块内存的值是不确定的。

  4. 巧合的'�': 代码输出'--------------'的原因是, 你所使用的编译器和运行环境下,one[strlen(one)+1] 访问到的内存单元恰好存储了'�'。

总结: 这段代码的运行结果是不可靠的。虽然看似输出了预期的结果,但其背后隐藏着数组越界访问的危险。在C语言编程中,务必注意数组边界,避免访问未分配的内存区域,才能编写出健壮可靠的代码。


原文地址: https://www.cveoy.top/t/topic/jnVo 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录