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");
}

运行结果如下:

图片说明

图片说明

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

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

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

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

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

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

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,这种做法是错误的

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

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

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