代码如下,使用二维数组存储字符串,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)