这是一个非常基本的问题,已被问到很多,但我看过的所有例子都略有不同
#include<stdio.h>
int main() {
char title[] = "HELLO!";
title[1] = "F";
printf("%s", title);
}
为什么会导致以下错误 -
jdoodle.c:6:14: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
title[1] = "F";
干杯
答案 0 :(得分:3)
它必须是这样的:
#include<stdio.h>
int main() {
char title[] = "HELLO!";
title[1] = 'F';
printf("%s", title);
}
'F'
是一个字符,它与作为字符串的"F"
不同。永远记住字符串是一个字符数组。
答案 1 :(得分:2)
"F"
是一个字符串文字。它有类型char[2]
(也就是说它是一个包含字符串的字符数组)并且在内存中显示为
char unnamed_literal[] = { 'F', '\0' };
来自C标准(6.4.5字符串文字)
6在翻译阶段7中,附加值为零的字节或代码 到由字符串产生的每个多字节字符序列 文字或文字.78)然后是多字节字符序列 用于初始化静态存储持续时间和长度的数组 足以包含序列。对于字符串文字, 数组元素的类型为char,并使用 多字节字符序列的各个字节...
例如,尝试执行此语句
printf( "%zu\n", sizeof( "F" ) );
在此表达式声明中
title[1] = "F";
左操作数的类型为char
,而具有类型char[2]
的右操作数被隐式转换为指向其第一个元素的指针,即它具有类型char *
。
来自C标准(6.3.2.1 Lvalues,数组和函数指示符)
3除非它是sizeof运算符或一元&amp;的操作数。 operator,或者是用于初始化数组的字符串文字, an 具有类型''数组类型''的表达式将转换为 带有''指向类型'的指针的表达式,指向初始值 数组对象的元素并且不是左值。如果是数组 对象具有寄存器存储类,行为未定义。
所以在这个陈述中
jdoodle.c:6:14:警告:赋值从指针生成整数而没有 演员
这是尝试将字符串文字的第一个字符的地址分配给一个没有意义的字符。
很明显,您的意思是将字符常量'F'
分配给title[1]
类型的对象char
。
你的意思是以下陈述
title[1] = 'F';
你可以使用字符串文字,但你需要它的第一个字符而不是它的地址。你可以写例如
title[1] = "F"[0];
或
title[1] = *"F";
甚至喜欢
title[1] = 0["F"];
但是当然使用字符常量而不是字符串文字
更好更简单title[1] = 'F';