【问题标题】:Difference between two methods of array pointer initialization两种数组指针初始化方法的区别
【发布时间】:2015-07-21 07:19:15
【问题描述】:

请解释两者的区别

char* str = "Hello";

char* str = {"Hello"};

【问题讨论】:

  • @EdHeal 哈哈.. 不幸的是,这不是我的作业......我只是一个可怜的程序员熬夜想知道为什么在 C 中存在这样的东西......
  • @HolyBlackCat 谢谢...已更正..
  • 你真的想知道吗?我告诉你,但不要告诉任何人:C 语言的各种做事方式让人们可以表达自己的个性,就像电影中英雄的蛇皮夹克所做的那样……我们的世界需要真正的英雄。随着我们慢慢学会尊重无辜蛇的生命,我们发明了 C 编程语言。 点头

标签: c pointers dynamic-memory-allocation array-initialization


【解决方案1】:

ISO 9899-1990 6.5.7(“初始化”)说:

字符类型的数组可以由字符串初始化 字面量,可选用大括号括起来。

【讨论】:

  • 对不起,也许我理解的完全错误,但这里没有数组,只有指针。此外,这个ideone.com/UKGfC3(导致段错误)证明第二种情况不是数组。
  • ANSI C 中的字符串文字是字符数组的快捷方式,不是吗?
  • 它们是,但我在这里没有看到 数组初始化。当然可以用这种字符串的地址初始化一个指针,但它是一个指针初始化。两种情况似乎都做同样的事情,但第二种情况的语法看起来很奇怪。
【解决方案2】:

我相信这个问题是以前回答过的问题。该链接将是 - Braces around string literal in char array declaration valid? (e.g. char s[] = {"Hello World"})

两个声明都是一样的。它为什么存在的答案是提供一些只是为了适应编码人员的口味。(句法糖) 我唯一要指出的是 char 数组变量声明与字符指针声明。您定义的指针尚未分配任何内存。因此,对字符串的任何编辑/写入操作都会导致分段错误。 考虑声明

    char str[] = "Hello";

    char str[] = {"Hello"};

【讨论】:

  • 如果我遵循字符点声明,我无法编辑字符串的原因不是因为它没有被分配内存,而是相反它(字符串)在数据的只读部分上分配了内存段和指针变量存储在读写部分...
  • 是的,你更精确!
【解决方案3】:

这些情况之间没有区别。

它们都将字符串文字的地址分配给 char 指针,但在第二种情况下,它使用了不寻常的语法。

同样,int a = 42;int a = {42}; 是等价的。


在您提到的 char *a = "Hello";char a[] = "Hello"; 的 cmets 中。

它们完全不同。第二个创建一个数组。意思和

一样
char a[] = {'H','e','l','l','o','\0'};

[] 内部没有数字,因为编译器可以为您猜测数组的大小(在这种情况下为6)。

而另一种情况则完全不同。

当您在 char 数组的初始化之外使用 "string literal" 时,例如在这种情况下

printf("Hello");

char *a = "Hello";

编译器隐式地创建一个const char 数组来保存你的字符串。如您所知,在这些上下文中,数组的名称衰减为指向它的第一个元素的指针。所以,

char *a = "Hello";

const char internal_array[] = "Hello";

char *a = internal_array; // same as  char *a = &internal_array[0];

等价的

如果你尝试做类似的事情

char *a = "Hello";
a[0] = 'A';

你会遇到崩溃,因为尽管是指向非 const char 的指针,a 实际上指向一个常量字符串。修改它不是一个好主意。


其他情况呢,

char a[] = "Hello";
a[0] = 'A';

完全没问题。在这种情况下,您将获得一个包含字符串的 charnew 数组。当然是非常量,所以你可以修改它。

【讨论】:

  • 好吧,我要向你坦白一些事情。当我遇到两种数组初始化时,我产生了疑问... Char a[]= "Hello";和 Char* a= "Hello"....然后在理解它们之间的区别时,我偶然发现了这个宝石......所以我进一步困惑这种声明风格是否有任何特殊原因..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多