C “为什么?”;“细菌”;声明中的as Rvalue充当数组对象,但在赋值的其他位置充当指针?
请容忍我,我也在添加一些次要问题,而不是单独发布这些问题 在声明中C “为什么?”;“细菌”;声明中的as Rvalue充当数组对象,但在赋值的其他位置充当指针?,c,arrays,pointers,declaration,C,Arrays,Pointers,Declaration,请容忍我,我也在添加一些次要问题,而不是单独发布这些问题 在声明中char name[]=“Germ”标识符Germ是char[5]类型,对吗?但是在像ptr=“Germ”这样的赋值中,ptr被声明为字符指针,“Germ”充当字符指针,对吗 这是我的困惑,请你澄清。即使是一行也会有帮助: 1) 为什么“Germ”在声明中是数组对象,而在第二个声明中是指针?我是否应该得出结论,在声明期间,特定语法的含义与在其他语句中的含义不同?例如,{'a','b','c'}是数组的初始值设定项,而不是复合语句,
char name[]=“Germ”代码>标识符Germ是char[5]类型,对吗?但是在像ptr=“Germ”
这样的赋值中,ptr被声明为字符指针,“Germ”充当字符指针,对吗
这是我的困惑,请你澄清。即使是一行也会有帮助:
1) 为什么“Germ”在声明中是数组对象,而在第二个声明中是指针?我是否应该得出结论,在声明期间,特定语法的含义与在其他语句中的含义不同?例如,{'a','b','c'}是数组的初始值设定项,而不是复合语句,即使包含在花括号中
2) 在这个问题的第一个声明中,“&name”和“name”是不同类型的吗?“&name”是大小为5的数组对象的地址,“name”是字符变量的地址,即称为name的数组的第一个元素的地址?我觉得是这样,但需要你的确认
3) 最后,如果在C中修改字符串是UB(我在一本好书中读过),为什么下面的代码甚至不显示警告并打印“ariund”
#include<stdio.h>
int main()
{
char str[]="around";
str[2]='i';
printf("%s",str);
return 0;
}
#包括
int main()
{
字符str[]=“环绕”;
str[2]=“i”;
printf(“%s”,str);
返回0;
}
非常感谢您的回答。这不是对您问题的直接回答,但它可能有助于您理解一些问题
鉴于以下功能:
void func()
{
char arr[] = "RW";
char* ptr = "RO";
}
在构建过程中,两个字符串都硬编码到可执行映像的只读部分
在运行时,每次调用函数时:
“RW\0”
字符串的内容被复制到堆栈中(即,复制到arr
)
“RO\0”
字符串的地址被复制到堆栈中(即,复制到ptr
)
此时,由于您拥有“RW\0”
字符串的副本,因此可以更改该副本的内容
您不能更改任何一个原始字符串,因为它们都位于只读内存段中
数组和指针之间的一些显著差异:
带int arr[10]
:
- 使用的内存量为
sizeof(int)*10个字节
arr
和&arr
的值必须相同
arr
指向一个有效的内存地址,但不能设置为指向另一个内存地址
带int*ptr=malloc(sizeof(int)*10)
:
- 使用的内存量为
sizeof(int*)+sizeof(int)*10个字节
ptr
和&ptr
的值不一定相同(事实上,它们大部分是不同的)
ptr
可以设置为同时指向有效和无效的内存地址,您可以设置多次
修改字符串文字无效,但对于大小写char str[]=“around”代码>它是有效的。这不是一项任务;它是数组的初始值设定项str
是数组的名称。数组存在于自动存储中。@Jayesh-umm,用简单而精确的术语来说,你是如何定义“字符串文字”的?字符串的标识符?ptr=“Germ”
是赋值使ptr指向字符串文字,该字符串文字是常量字符串,它位于只读部分。@user3121023 Oops,typo。更正。你很接近我想要的答案。你能给我一个试图更改原始字符串的语句的例子吗?你的更新非常有用,但我仍然无法为我在上述评论中提出的问题找到答案。请给出一个简单的例子,说明试图更改您所演示的原始字符串的语句。请…@Meathead:为了更改ptr
指向的原始“RO\0”
字符串的内容,您可以简单地执行类似ptr[0]='k'
的操作。当然,这将导致运行时内存访问冲突。谢谢。它准确地回答了我的问题。@Meathead:不客气,请点击旁边的V接受答案:)