Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将字符串赋给int类型的变量_C - Fatal编程技术网

C 将字符串赋给int类型的变量

C 将字符串赋给int类型的变量,c,C,为什么我可以将字符串赋给int类型的变量?下面的代码编译正确: int main(int argv, char** argc){ int a="Hello World"; printf(a); } 此外,当我将字符串分配给不同类型的变量(即double和char)时,程序不会编译 我想实际发生的是编译器执行int*a=“Hello World”当我写双a=“Hello World”,它按原样执行该行代码 这是否正确?它将编译,因为(在32位系统上)int、int*和char*都

为什么我可以将字符串赋给int类型的变量?下面的代码编译正确:

int main(int argv, char** argc){
    int a="Hello World";
    printf(a);
}
此外,当我将字符串分配给不同类型的变量(即double和char)时,程序不会编译

我想实际发生的是编译器执行
int*a=“Hello World”当我写
双a=“Hello World”,它按原样执行该行代码


这是否正确?

它将编译,因为(在32位系统上)int、int*和char*都对应于32位寄存器——但double是64位,char是8位。

编译时,我收到以下警告:

[11:40pm][wlynch@wlynch /tmp] gcc -Wall foo.c -o foo
foo.c: In function ‘main’:
foo.c:4: warning: initialization makes integer from pointer without a cast
foo.c:5: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast
foo.c:5: warning: format not a string literal and no format arguments
foo.c:5: warning: format not a string literal and no format arguments
foo.c:6: warning: control reaches end of non-void function
从警告中可以看到,
“Hello World”
是一个指针,它正在自动转换为整数

但是,您给出的代码并不总是正确工作。指针有时大于int。如果大于int,则可能会得到截断的指针,然后在尝试使用该值时出现非常奇怪的错误。

“Hello World”
是一个以
char'\0'结尾的字符数组。

将其值分配给
int a
时,将数组中第一个字符的地址分配给
a
。GCC正试图善待你


当您打印它时,它会转到
a
指向的位置并打印所有字符,直到到达
char'\0'

事实上,该赋值违反了约束,需要任何符合条件的C实现进行诊断(可能只是警告)。C语言标准没有定义程序的行为

编辑:的第6.5.16.1节介绍了简单赋值允许的操作数。旧的C90标准基本上有相同的规则。前ANSIC(如1978年出版的K&R1中所述)确实允许这种特殊类型的隐式转换,但自1989年版本的语言以来,它一直无效

如果它真的编译了,可能会发生什么呢

int a="Hello World";
被当作

int a = (int)"Hello World";
强制转换采用指针值并转换为int。这种转换的含义由实现定义;如果
char*
int
的大小不同,则可能会丢失信息

某些转换可以显式完成,例如在不同的算术类型之间。这个可能不行

您的编译器应该对此进行投诉。提高警告级别,直到达到。(告诉我们您使用的编译器,我们可以告诉您如何使用。)

编辑:

printf
调用:

printf(a);
在C90中有未定义的行为,在C99中是违反约束的,需要诊断,因为您调用的变量函数没有可见的原型。如果要调用
printf
,必须具有


你应该找一个更好的编译器。这(可能)试图将指针值转换为类型
double
,这根本没有任何意义。

它会在GCC和clang等编译器上产生警告

warning: initialization makes integer from pointer without a cast [enabled by default]
字符串literal
“Hello World”
是一个
const char*
,因此您正在分配一个指向
int
的指针(即,将字符串中第一个字符的地址转换为
int
值)。在我的编译器gcc 4.6.2和clang mac lion上,将字符串分配给
int
unsigned long
char
都会产生警告,而不是错误


坦率地说,这不是一种可以依赖的行为。更不用说,你的
printf(a)
也是使用
printf

的一种危险用法。请查看此线程-如果编译时没有收到任何警告,则需要打开一些编译器警告,或者使用更好的编译器。编译器不会转换
a
;相反,它将数组的第一个字符的地址视为整数。该代码在32位平台上“工作”。它可能无法在64位平台上工作,因为
int
是32位量,指针是64位量。如果地址中设置了任何高阶32位,则指针将被截断,无法工作。感谢您的澄清。虽然它在我的64位平台上工作。谢谢。我应该更加注意编译器的警告。我知道将指针值转换为类型double没有意义,但将其转换为类型char也没有意义。我从这段代码中得到的唯一警告是
chara=(char)“Hello World\n”;printf(“%p”,a)是它们有不同的大小。顺便说一下,输出是
0xffffffb0
。指向整数转换的指针通常是有意义的;只要整数类型足够大,能够在不丢失信息的情况下保存转换后的指针值(此类转换“旨在与执行环境的寻址结构保持一致”),它们就很有用(如果不可移植)。指向字符转换的指针几乎肯定会丢失信息。使用
%p
打印字符值具有未定义的行为(要查看实际值,请将cat转换为int并使用
%d”
)。指向浮点转换的指针不是非法的,但标准中没有定义它们的行为。感谢您的澄清。从我以前的帖子中收集的信息来看,我不认为双精度的大小是我的程序无法编译的原因(如果我错了,请纠正我)。我认为原因是将指针值转换为double或char类型没有意义。即使char*和int大小不同,程序仍然可以编译。事实上,下面的代码没有给出编译器错误:“char*a=(char)“helloworld”;”。它只是给出了一个编译器警告,因为char*和char大小不同我认为整个代码
double a="Hello World";
warning: initialization makes integer from pointer without a cast [enabled by default]