C语言 存储在指向未初始化数组的指针中的值不是NULL?



我总是得到下面程序的输出为';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?

  1. 数组a定义得很好。它没有初始化,数组的元素还没有确定。因此,当您打印数组a的元素时,可以输出任何值。阅读未定义行为

  2. 指针b未"存储";任何值。它存储对具有char类型的对象的引用。该对象可以"存储"。一个char值,但不是指针本身。

  3. 由于数组a定义良好并且驻留在内存中,因此对其第一个元素的引用(因为a衰减为指向该数组第一个元素的指针)不可能是NULL

我想你应该读一下你最喜欢的C书的指针章节。

存储在指向未定义数组的指针中的值不是NULL?

指针值是数组的地址,不管它(数组)是否赋值,所以不,它不会为NULL。


总是得到下面程序的输出为&;b不为空&;当我尝试打印ab的值时,它们绝对是空白的。知道为什么会这样吗?

打印指针值的说明符是%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

相关内容

  • 没有找到相关文章

最新更新