阿阿阿安 2017-11-06 03:06 采纳率: 50%
浏览 3062
已采纳

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
  • 写回答

9条回答 默认 最新

  • threenewbee 2017-11-06 03:50
    关注

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • threenewbee 2017-11-06 03:13
    关注

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

    评论
  • jssmartstar 2017-11-06 03:26
    关注

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

    评论
  • liyangfamily 2017-11-06 03:27
    关注

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

    评论
  • 阿阿阿安 算法领域新星创作者 2017-11-06 03:44
    关注

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

    评论
  • threenewbee 2017-11-06 03:53
    关注

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

    评论
  • zy35 2017-11-06 06:18
    关注

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

    评论
  • 阿阿阿安 算法领域新星创作者 2017-11-06 08:41
    关注

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

    评论
  • qq_39790138 2017-11-06 10:51
    关注

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

    评论
查看更多回答(8条)

报告相同问题?

悬赏问题

  • ¥15 相同型号电脑与配置,发现主板有一台貌似缺少了好多元器件似的,会影响稳定性和使用寿命吗?
  • ¥15 要求编写稀疏矩阵A的转置矩阵的算法
  • ¥15 编写满足以下要求的停车场管理程序,设停车场只有一个可停放n辆车的狭窄通道且只有一个大门可供车辆进出。
  • ¥20 powerbulider 导入excel文件,显示不完整
  • ¥15 用keil调试程序保证结果进行led相关闪烁
  • ¥15 paddle训练自己的数据loss降不下去
  • ¥20 用matlab的pdetool解决以下三个问题
  • ¥15 单个福来轮的平衡与侧向滑动是如何做到的?
  • ¥15 嵌入式Linux固件,能直接告诉我crc32校验的区域在哪不,内核的校验我已经找到了,uboot没有
  • ¥20 h3c静态路要求有详细过程