预测该指针的输出

问题描述 投票:0回答:1

在下面的程序中。这种类型转换是如何工作的,因为当格式说明符为 %d 时,它打印 1,但对于 %s ,它不打印任何内容?为什么会发生这种情况?

#include <stdio.h>
int main()
{
unsigned int n = 1;
char *c = (char*)&n;
printf("%d %s",*c,c);
if (*c)
printf("LITTLE ENDIAN");
else
printf("BIG ENDIAN");
return 0;
}
c pointers
1个回答
0
投票

您提供的程序通过将 unsigned int 转换为 char* 来检查系统的字节序(字节序列在计算机内存中存储的顺序)。

printf("%d %s", *c, c);
尝试打印两个值:

%d 需要一个 int 并在 c 指向的内存位置打印整数值,即 1。 它为 %d 打印“1”的原因是因为它读取存储值 1 的 unsigned int 的第一个字节。

%s 需要一个以 null 结尾的字符数组(字符串),并从 c 指向的内存位置开始打印该字符串。但是,不能保证这在内存中是有效的字符串,并且它可能不是以 null 终止的,从而导致不可预测的行为。在 C 中,用 %s 打印非空终止字符数组是未定义的行为。

它不为 %s 打印任何内容的原因是因为 c 指向的内存位置不能保证以 null 结尾或包含有效的字符串。将其打印为带有 %s 的字符串是未定义的行为,可能会导致意外结果。

© www.soinside.com 2019 - 2024. All rights reserved.