将字符串存储在C中的整数变量中

Joh*_*Doe 1 c

#include <stdio.h>
int main()
{
    int a = "Hi";
    char b = 'F';

    int c = a + b;

    printf("%d",a);        /* (1) */
    printf("%d",c);        /* (2) */ 
}
Run Code Online (Sandbox Code Playgroud)

为什么指令(1)的输出是18537?它是如何以ANSI标准存储值的

指令(2)很清楚,因为我们基本上增加了70到18537,它给出了18607

有人可以根据字符串详细说明值是如何存储在整数变量中的吗?

klu*_*utt 6

编译器警告胜利!

$ cc -Wall -Wextra e.c 
e.c: In function ‘main’:
e.c:4:13: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
     int a = "Hi";
             ^~~~
Run Code Online (Sandbox Code Playgroud)

您将字符串文字的内存地址分配给变量a.好吧,在很多情况下你会这样做.但是,这不能保证,并且存在潜在的问题.例如,a int可能不足以容纳整个地址.

值得指出的是,这不是有效的C代码,所以不要这样做.根据https://port70.net/~nsz/c/c11/n1570.html#6.5.16.1p1(感谢@Lundin提供链接):

以下其中一项应持有:112)

  • 左操作数具有原子,限定或非限定算术类型,右边有算术类型;
  • 左操作数具有与右侧类型兼容的结构或联合类型的原子,限定或非限定版本;
  • 左操作数具有原子,限定或非限定指针类型,并且(考虑左值操作数在左值转换后将具有的类型)两个操作数都是指向兼容类型的限定或非限定版本的指针,左侧指向的类型具有全部右边指出的那种限定词;
  • 左操作数具有原子,限定或非限定指针类型,并且(考虑左值操作数在左值转换后将具有的类型)一个操作数是指向对象类型的指针,另一个是指向合格或非限定版本的指针void,左边指向的类型具有右边指向的所有类型的限定符;
  • 左操作数是一个原子,限定或非限定指针,右边是一个空指针常量; 要么
  • 左操作数的类型为atomic,qualified或nonqualified _Bool,右边是指针.

请参阅Lundin关于如何强制编译器不接受无效代码的答案.


Lun*_*din 5

int a = "Hi"; 是无效的C代码,并推测它在非标准编译器上可能做什么并不是很有意义.

该代码违反了简单赋值6.5.16.1的规则.没有强制char*转换int,您无法隐式分配.

(如果要阻止在gcc编译器上编译无效的C代码,请使用-std=c11 -pedantic-errors.)