我总是得到下面程序的输出为';b不是null ';当我尝试打印a或b的值时,它们完全是空白的。知道为什么会这样吗?
#include <stdio.h>
int main()
{
char a[10];
char *b = a;
if(b == NULL)
printf("b is NULL");
else
printf("b is not NULL");
return 0;
}
char a[10];
char *b = a;
存储在指向未定义数组的指针中的值不是NULL?
数组
a
定义得很好。它没有初始化,数组的元素还没有确定值。因此,当您打印数组a
的元素时,可以输出任何值。阅读未定义行为指针
b
未"存储";任何值。它存储对具有char
类型的对象的引用。该对象可以"存储"。一个char值,但不是指针本身。由于数组
a
定义良好并且驻留在内存中,因此对其第一个元素的引用(因为a
衰减为指向该数组第一个元素的指针)不可能是NULL
。
我想你应该读一下你最喜欢的C书的指针章节。
存储在指向未定义数组的指针中的值不是NULL?
指针值是数组的地址,不管它(数组)是否赋值,所以不,它不会为NULL。
总是得到下面程序的输出为&;b不为空&;当我尝试打印
a
或b
的值时,它们绝对是空白的。知道为什么会这样吗?
打印指针值的说明符是%p
。
现场演示
char a[10];
char *b = a;
printf("n%p", (void*)b);
printf("n%p", (void*)a);
输出应该是这样的:
0x7ffec02d3d16
0x7ffec02d3d16
因此,正如你所看到的,指针值不是NULL,而是数组的地址。
另一方面,如果您将字符数组当作字符串来打印,则即:
printf("n%s", b);
printf("n%s", a);
你的程序有未定义的行为,它可能什么都不打印,它可能打印一些随机字符,这些字符对应于垃圾数据,这些数据存储在声明的数组现在占用的内存位置中,这些是最常见的结果,但是由于没有要求显示未定义行为的程序应该做什么,你可以期待各种奇怪的结果。
指针b
有合法的值。它指向数组a的第一个元素。
char a[10];
char *b = a;
所以它不能等于NULL
另一方面,没有初始化具有自动存储持续时间的数组a
。它的元素值不确定。
如果用字符串或字符序列初始化数组,则可以使用指针b
输出它们。
例如
char a[10] = "Hello";
char *b = a;
puts( b );
或
char a[10] = "0123456789";
char *b = a;
printf( "%.*sn", ( int )sizeof( a ), b );
如果你想输出存储在指针b中的值,即数组a的第一个元素的地址,你可以这样写:
printf( "b = %pn", ( void * )b );
输出值将与调用printf
printf( "a = %pn", ( void * )a );
您可以编写以下测试程序:
#include <stdio.h>
int main(void)
{
char a[10];
char *b = a;
if ( b == a )
{
puts( "b is equal to the address of the first element of a" );
}
return 0;
}
其输出将是
b is equal to the address of the first element of a