fyz2014
FuYingzhe
2018-02-02 06:29
采纳率: 100%
浏览 3.2k
已采纳

C语言二维数组存储字符串问

代码如下,使用二维数组存储字符串,buf[4]为什么不等于NULL

 void main()
{
    char buf[][10] = {
        "1111",
        "2222",
        "3333",
        "4444",
        NULL
    };

    printf("sizeof buf = %d\r\n", sizeof(buf));

    if (buf[4] != NULL){
        printf("buf[4] != NULL\n");
    }
    system("pause");
}

运行结果如下:

图片说明

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

8条回答 默认 最新

  • qq_38646470
    龙跃十二 2018-02-02 09:49
    已采纳

    图片说明

    刚学习一定要多调试代码。

    点赞 评论
  • yxhlfx
    双林子木 2018-02-02 07:00

    你的那种定义方式暗示了这是一个以10个字节内存块为单位组成的数组,因此这个数据内存在编译阶段由编译器已经确认好的,而你定义中的初始化可以理解成将里面的值赋值给了数据元素,而不是将指针保存在数组中。要达到你的意图,正确的定义方式应该是这样:

     char *buf[] = {
         "1111",
            "2222",
            "3333",
            "4444",
            NULL,
     };
    

    这样这个数组就是一个指针数据,数据中保存的值是直线上面常量字符串的指针。

    点赞 评论
  • xkl01
    xkl01 2018-02-02 07:01

    buf[4]指向一个内容全0的10字节数组的地址

    点赞 评论
  • weixin_39868880
    陌上客1 2018-02-02 07:09

    C语言是二位数组是一块连续的区域,在buf[4]之前分配了具体的空间大小,紧跟在其后的buf[4]是用分配空间的,
    除非你定义的是指针数组,如楼上所说的方式

    点赞 评论
  • barry_di
    barry_di 2018-02-02 07:50

    char buf[][10] = {
    "1111",
    "2222",
    "3333",
    "4444",
    NULL
    };
    在这里NULL其实相当于“”空字符串,初始化时实际做的相当于做这样的初始化 char buf[0]="1111",char buf[1]="2222" ..... ,char buf[4] = "",
    buf[4]是有自己的地址的,当然不等于NULL了, 按你的理解,初始化时执行的是char s[10] = NULL,这种做法是错误的

    点赞 评论
  • keepanything
    keepanything 2018-02-02 09:24

    这数组已经分配空间了,buff[4]当然不是NULL, buff[4]所保存的地址是NULL,但buff[4]不是

    点赞 评论
  • WRajer
    WRajer 2018-02-02 14:50

    buff[4]为指针,指的是第四行首元素的地址,不为null

    点赞 评论
  • zhagoodwell
    zhagoodwell 2018-02-06 01:02

    if (buf[4][0]!=NULL)

    点赞 评论

相关推荐