C 为指针的索引赋值
我试图给指针的第二个索引赋值,它会给我一个警告 “[警告]赋值从指针生成整数,无需强制转换” 它不运行这个程序。我想知道,我在哪里犯了错误C 为指针的索引赋值,c,pointers,variable-assignment,C,Pointers,Variable Assignment,我试图给指针的第二个索引赋值,它会给我一个警告 “[警告]赋值从指针生成整数,无需强制转换” 它不运行这个程序。我想知道,我在哪里犯了错误 #include<stdio.h> void main() { char *p="John"; *(p+2)="v"; printf("%s",p); } #包括 void main() { char*p=“约翰”; *(p+2)=“v”; printf(“%s”,p); } 首先,在您的代码中 char *p="J
#include<stdio.h>
void main()
{
char *p="John";
*(p+2)="v";
printf("%s",p);
}
#包括
void main()
{
char*p=“约翰”;
*(p+2)=“v”;
printf(“%s”,p);
}
首先,在您的代码中
char *p="John";
p
指向字符串文本,并尝试修改字符串文本调用
相关,C11
,第§6.4.5章
[…]如果程序试图修改这样的数组,则该行为为
未定义
如果要修改,则需要一个数组,如
char p[]="John";
其次,*(p+2)=“v”
是错误的,因为“
表示一个字符串,而您需要一个char
(提示:检查类型os*(p+2)
)。换成
*(p+2)='v';
为了详细说明差异,请引用第§6.4.4.4章中的C11
,作为字符常量
整数字符常量是一个包含一个或多个多字节字符的序列
在单引号中,如在'x'
中
和第§6.4.5章,字符串文字
字符串文字是包含在字符串中的零个或多个多字节字符的序列
双引号,如中的“xyz”
第三,根据C标准,
void main()
在代码中至少应该是int main(void)
第一
char *p="John";
p
指向字符串文本,并尝试修改字符串文本调用
相关,C11
,第§6.4.5章
[…]如果程序试图修改这样的数组,则该行为为
未定义
如果要修改,则需要一个数组,如
char p[]="John";
其次,*(p+2)=“v”
是错误的,因为“
表示一个字符串,而您需要一个char
(提示:检查类型os*(p+2)
)。换成
*(p+2)='v';
为了详细说明差异,请引用第§6.4.4.4章中的C11
,作为字符常量
整数字符常量是一个包含一个或多个多字节字符的序列
在单引号中,如在'x'
中
和第§6.4.5章,字符串文字
字符串文字是包含在字符串中的零个或多个多字节字符的序列
双引号,如中的“xyz”
第三,根据C标准,
void main()
至少应该是int main(void)
您正在将一个字符串文本的指针分配给另一个字符串文本的元素
首先,您需要更改指针并使其成为数组,因此任何修改都是合法的,这是一个示例
char p[] = "John";
然后需要将“v”
替换为“v”
,它是一个由两个字符'v'
和'\0'
组成的字符串文字,它是字母'v'
的ascii值,是一个整数
*(p + 2) = 'v';
此外,这是第三个元素,而不是第二个,因为第一个元素是
p[0]
您正在将一个字符串文本的指针分配给另一个字符串文本的元素
首先,您需要更改指针并使其成为数组,因此任何修改都是合法的,这是一个示例
char p[] = "John";
然后需要将“v”
替换为“v”
,它是一个由两个字符'v'
和'\0'
组成的字符串文字,它是字母'v'
的ascii值,是一个整数
*(p + 2) = 'v';
另外,这是第三个元素,而不是第二个,因为第一个元素是
p[0]
您犯了两个错误
首先,您试图修改字符串文本的内容;这会调用未定义的行为,这意味着以下任何行为都是可能的(并且被认为是同样正确的):代码可能会崩溃,可能会运行到完成而没有问题,可能会运行到完成但不会改变字符串文字,可能会使系统处于错误状态,等等。编译器可能会完全拒绝代码,虽然我不知道有哪个编译器能做到这一点
如果希望能够修改字符串的内容,则需要为该字符串留出存储空间,而不仅仅是指向字符串文字:
char p[] = "John"; // copies the contents of the string literal "John" to p
// p is sized automatically based on the length of the
// string literal
下面是一个假设的内存映射,显示了该声明和初始化的结果:
Address Item 0x00 0x01 0x02 0x03
------- ---- ---- ---- ---- ----
0x8000 "John" 'J' 'o' 'h' 'n'
0x8004 0x00 0x?? 0x?? 0x?? // 0x?? represents a random byte value
...
0xfffdc100 p 'J' 'o' 'h' 'n'
0xfffdc104 0x00 0x?? 0x?? 0x??
不应修改位于0x8000
的字符串文字;可以修改位于0xfffdc100
的p
中的字符串(尽管缓冲区的空间最多只能存储4个字符的字符串)
您的第二个错误(也是导致编译器抱怨的错误)在这一行:
*(p+2)="v";
表达式“v”
是字符串文字,具有类型“char的2元素数组”;由于它不是sizeof
或一元&
运算符的操作数,因此类型“衰减”为“指针指向char
”,表达式的值是字符串文本“v”
的地址
表达式*(p+2)
具有类型char
(它解析为单个字符值),它是一种整数类型,而不是指针类型。不能将指针值指定给非指针对象
您可以通过将该行更改为
*(p + 2) = 'v'; // note single quote vs double quote
这一次,您没有尝试将字符串文本的地址分配给
p[2]
,而是分配单个字符的值 你犯了两个错误
首先,您试图修改字符串文本的内容;这会调用未定义的行为,这意味着以下任何行为都是可能的(并且被认为是同样正确的):代码可能会崩溃,可能会运行到完成而没有问题,可能会运行到完成但不会改变字符串文字,可能会使系统处于错误状态,等等。编译器可能会完全拒绝代码,