c语言二维数组初始化问题

图片说明

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i;
    char s[2][5]={"12345","12345"};
    for(i=0;i<2;i++)
    {
        printf("%s\n",s[i]);
    }
    return 0;

}

 为什么运行是这样的不应该是12345 吗
                                             12345

为什么一维字符数组的时候或者普通数组等于长度就可以正常输出
因为数组后面的内存是0,起到了截止字符串的作用。其实还是越界了,只是没有造成严重的后果。
但是二维数组,后面的空间正好你又存入另一个12345了,没有0了,错误就暴露出来了。

好比你开车,如果开到马路外面,人行道上没有车,那么表面上看没事,但是你这么开有隐患。
但是如果马路上正好有人,那么就撞到人了。所以不是人行道的人错了,而是你这么开车就不对。

字符串越界了,你存12345,需要6个长度,结尾的\\0你没有考虑

C语言中的数组内容是连续存放的,因此s[0]、s[1]两个会连在一起,要区分出来的话,就必须要有分隔符'\0',而printf在打印时遇到'\0'才会结束。
现在你定义的空间大小为5个字节,当然就无法包含分隔符了,所以打印出来的就是这样子,而且可能每次运行结果都会不一样,因为s[1]后面没有存放分隔符'\0'的位置,就可能是任意字符。

你没有考虑字符串后面的\0

那为什么一维字符数组的时候或者普通数组等于长度就可以正常输出

如果问题得到解决,麻烦点下我回答右边的采纳,谢谢。

字符串输入时会以“\0”结束,这个也包含在字符内,故要在长度上加一,否则在输出时会越界。

比如输入五个字符,定义数组长度为5时就够用了吧,因为0时是第一个字符,那么五不就是‘\0' 为什么还要定义6

五个字符存在数组里需要六个字符的空间