如何将字符指针分配给字符变量

  • 本文关键字:分配 字符变量 指针 字符 c
  • 更新时间 :
  • 英文 :


Phew!我有以下代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char t[10] = "John";
char x = t;
printf("%cn", x);
return 0;
}

编译器怎么能不给我一个错误呢?此外,printf语句正在输出不同的结果。变量x的具体赋值是什么?

如果编译时出现警告,您将收到以下投诉:

警告:初始化使指针中的整数不带强制转换[默认启用]

它编译失败的原因是因为在引擎盖下发生了三件事:

  • 首先,数组衰减为指针(数组和指针不相同,但数组在必要时"衰减"为指针)
  • 则该指针被转换为整数
  • 最后将该整数转换为CCD_ 1并分配给CCD_

从整数到字符的转换不是问题(由于C中的字符常数实际上是ints,所以这种情况一直都会发生),但程序员很少打算将指针转换为整数,因此发出了警告。这并不是完全错误的,但也不是很有意义。

所以最后printf打印t的第一个元素的地址的剩余部分。

在c中,指针是标量值,char也是,int也是。标量基本上意味着它是一个数字。所有标量都可以相加、相乘等。总有一种方法可以将一个标量转换为另一个标量。

当你这样做的时候char x = t;它隐式地将指针t强制转换为一个字符。变量x将包含指针的8个最低有效位。

不同的编译器处理标量转换的方式不同。有时,它们要求您显式地将一个强制转换为另一个。例如char x = (char)t;如果隐式强制转换会导致精度损失,则有些会向您发出警告。(从int到char的强制转换可能会丢失精度,但从char到int的强制转换不会丢失精度)每当您尝试隐式强制转换任何内容时,某些编译器都会给您带来错误。

收到错误还是警告取决于编译器和编译器的设置。尝试启用警告。

在gcc中,您可以通过在compile命令中添加-Wall来启用所有警告,也可以通过添加-Werror 将所有警告转化为错误

在C中,数组的名称大多数时候意味着指向其第一个元素的指针。将指针强制转换为整数当然是有效的,在C中,char0只是一个整数,即使可能是不可靠的代码。无论如何,这里gcc-4.8.2-7.fc19.x86_64告诉我:

$ gcc -c xxx.c 
xxx.c: In function ‘main’:
xxx.c:6:14: warning: initialization makes integer from pointer without a cast [enabled by default]
char x = t;
^

而clang-3.3-4fc19.x86_64转到:

$ clang -c xxx.c 
xxx.c:6:10: warning: incompatible pointer to integer conversion initializing
'char' with an expression of type 'char [10]' [-Wint-conversion]
char x = t;
^   ~
1 warning generated.

没有错误,但有可怕的警告。

最新更新