测试代码

#include <stdio.h>
int main() 
{
    char test_arr_1[] = "Hello";
    char test_arr_2[] = { 'H','e','l','l','o' };
    printf("Printf输出\n");
    printf("%s\n",test_arr_1);
    printf("%s\n", test_arr_2);
    printf("for遍历输出\n");
    int  i = 0;
    for (i = 0; i < 5; i++)
    {
        printf("%c", test_arr_2[i]);
    }
    printf("\n");
    printf("Puts输出\n");
    puts(test_arr_1);
    puts(test_arr_2);
    printf("test_arr_3输出测试\n");
    char test_arr_3[] = { 'H','e','l','l','o','\0'};
    printf("Printf输出\n");
    printf("%s\n", test_arr_3);
    printf("Puts输出\n");
    puts(test_arr_3);
}

问题分析

通过编译器的内存查看
test_arr_1
test_arr_2
内存中
tes_arr_1数组一列
0x00000002C8BEFB24 48 65 6c 6c 6f 00 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc 48 65 6c 6c 6f cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
test_arr_2数组一列
0x00000002C8BEFB44 48 65 6c 6c 6f cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
内存中的十六进制前五位置无区别 但是在后续位置arr_1出现了00 (0)代表了数组的结束
而arr_2数组无0 则以字符串形式输出时出现了越界

再说puts函数

该函数用于输出字符串
其停止是在读取到第一个空字符时终止
如果char test_arr_2[] = { 'H','e','l','l','o' };如此定义 则会导致puts无法读取到0则会一直输出
造成图片内错误

运行结果

windowsoutput

最后修改:2022 年 10 月 11 日
如果觉得我的文章对你有用,只需评论或转发支持,谢绝投喂!