为什么" Germ"声明中的Rvalue作为数组对象,但作为指针中的其他指针?

时间:2014-09-14 09:54:48

标签: c arrays pointers declaration

请耐心等待,因为我正在添加一些次要的次要问题而不是单独发布

在声明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”?< / p>

#include<stdio.h>

int main()
{
char str[]="around";
str[2]='i';
printf("%s",str);
return 0;
}

你的回答将非常感谢。

1 个答案:

答案 0 :(得分:3)

这不是您问题的直接答案,但它可能有助于您了解一些问题......


给出以下功能:

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可以设置为指向有效和无效的内存地址,可以多次使用