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

时间:2014-02-11 20:50:53

标签: c

唷!我有以下代码:

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

编译器怎么不在这里给我一个错误?此外,printf语句输出不同的结果。究竟是什么分配给变量x?

3 个答案:

答案 0 :(得分:2)

如果您使用警告进行编译,则会收到以下投诉:

  

警告:初始化从指针生成整数而没有强制转换[默认启用]

编译失败的原因是因为有三件事情发生在幕后:

  • 首先,数组衰减为指针(数组和指针相同,但数组在必要时'衰减'到指针),
  • 然后该指针被转换为整数
  • 最后,整数转换为char并分配给x

从整数到字符的转换不是问题(并且它始终发生,因为C中的字符常量实际上是int s),但是将指针转换为整数很少是程序员的意图,因此警告。这不是严格错误,但也不是很有意义。

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

答案 1 :(得分:2)

在c中,指针是标量值,因此是char,因此是int。标量基本上意味着它是一个数字。所有标量都可以添加,增加等等。总有一种方法可以从一个标量转换为另一个标量。

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

不同的编译器以不同方式处理标量转换。有时它们要求您明确地将一个转换为另一个。例如char x = (char)t;如果隐式演员表导致精度损失,有些人会给你警告。 (从int到char的转换可能会失去精度,但是从char到int的转换不会丢失精度)有些编译器会在您尝试隐式转换任何内容时给出错误。

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

在gcc中,你可以通过在编译命令中添加-Wall来启用所有警告,或者你可以通过添加-Werror将所有警告变成错误

答案 2 :(得分:-1)

在C中,大多数时候数组的名称表示指向其第一个元素的指针。将指针强制转换为整数当然是有效的,而在C中,char只是一个整数,即使可能是狡猾的代码。无论如何,这里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-4.fc19.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.

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