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接受答案:)