2 fyz2014 fyz2014 于 2018.02.02 14:29 提问

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
qq_38646470   2018.02.02 17:49
已采纳

图片说明

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

qq_38646470
qq_38646470 回复zt3032: vs2008 建议用高版本的 都出17了 我用习惯了08 一直没换
4 个月之前 回复
zt3032
zt3032 这是什么工具,能打印出右面的表格。
4 个月之前 回复
xkl01
xkl01   2018.02.02 15:01

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

yxhlfx
yxhlfx   2018.02.02 15:00

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

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

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

weixin_39868880
weixin_39868880   2018.02.02 15:09

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

barry_di
barry_di   2018.02.02 15: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 17:24

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

WRajer
WRajer   2018.02.02 22:50

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

zhagoodwell
zhagoodwell   2018.02.06 09:02

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!