【问题标题】:In C, does difference between char *s and char s[] apply to other types?在 C 中,char *s 和 char s[] 之间的区别是否适用于其他类型?
【发布时间】:2016-12-29 00:29:47
【问题描述】:

我已经看到(12):

char s[] = "abc";
char t[3] = "abc";

实际上等同于:

char s[] = { 'a', 'b', 'c', '\0' };
char t[] = { 'a', 'b', 'c' };

还有以下内容:

char *word = "abc";
word[0] = 'd';

word放在只读内存中,导致非法内存操作word[0] = 'd'出错。

这只是chars 的情况吗?当我做这样的事情时,我不会得到错误:

int array[] = {1, 2, 3};
int *p = array;
p[0] = 0; // No error here
array[1] = 1; // or here

【问题讨论】:

  • 是的,这些行为特定于字符数组和字符串文字。阅读 C 标准以获取完整的详细信息。
  • 真诚地,我不知道他们为什么对您的问题投反对票。
  • 在你的第一段代码中,t[3] = "abc" should be char t[3] = "abc";同样在你的第二块。
  • 前两行彼此相同。并且标准中没有对ROM的要求。运行操作系统的 PC 甚至没有 ROM。也不需要生成运行时错误。目前尚不清楚您的意图或实际问题是什么。 sn-ps 甚至没有可比性,并且缺少信息。
  • 注意word本身就是一个可修改的变量;它可以被分配一个新的指针值。当您使用char *word = "abc"; 时,您将其指向一个字符文字,该文字被视为一个字符数组。尝试修改字符串文字会导致未定义的行为。字符串不必在只读内存中(尽管现在通常是这样)。将"abc" 修改为"dbc" 的尝试可能会成功,并且可能同时将字符串文字"xyzabc" 修改为"xyzdbc" — 否则可能会失败并导致程序崩溃。你应该使用const char *word = "abc";

标签: c syntax


【解决方案1】:

它只适用于字符串字面量

字符串字面量隐式创建一个char[N] 类型的数组对象,其中包含字面量中的字符,后跟终止\0' 字符。此对象具有静态存储持续时间并且是只读的。 (它不是const,出于历史原因,但尝试修改它具有未定义的行为。)

当你写作时:

char *ptr = "abc";

您正在创建ptr 作为指针对象,并将其初始化为指向包含"abc" 的只读静态数组。 (您可以通过将其定义为 const 来防止尝试对其进行修改。)

当你写作时:

char arr[] = "abc";

您将arr 创建为char[4] 类型的数组对象,并将静态只读数组的内容复制到该对象中。 arr 不是只读的。

int array[] = {1, 2, 3};

创建一个数组对象并初始化它,如图所示。没有像字符串文字一样的“整数数组文字”。 (几乎有——参见“复合文字”——但它们没有与字符串文字相同的只读语义。)

请注意:

char t[3] = "abc";

是一种特殊情况:如果数组是用字符串字面量初始化的,并且没有空间用于终止 '\0',那么只有非空字符会被复制到数组中。因此,t 不包含字符串,只是一个未终止的字符序列。这与您的问题并不特别相关。

【讨论】:

  • 谢谢!这有点离题,但您写道:“您可以通过将 [char* ptr = "abc"] 定义为 const 来防止尝试修改它。”任何修改char* ptr = "abc"(没有const)的尝试都已经失败了,所以你能澄清一下你的意思吗?编辑:我可能忽略了在与我不同的计算机上没有 const 前缀 (?) 的程序的可能性。
  • 如果你写char *s = "abc"; s[0] = 'A';,你可能会遇到运行时崩溃。 (事实上​​,行为是未定义的;某些实现可能无法捕获它。)如果您改为编写const char *s = "abc"; s[0] = 'A';,那么编译器将捕获该错误。尽早发现错误(几乎)总是更好。
【解决方案2】:

对于其他数组类型的字符串文字没有精确的模拟。但是你可以通过使用 const 限定的复合文字来稍微接近

const int *p = (const int []) { 1, 2, 3 };

它有可能会被放入只读内存中,并且如果尝试修改它可能会导致程序崩溃(在抛弃 constness 之后)。与字符串文字的另一个相似之处是 const 限定的复合文字可能共享存储。

复合字面量和字符串字面量的一个明显区别是字符串字面量始终具有静态存储时长,而块级复合字面量具有自动存储时长。

【讨论】:

    猜你喜欢
    • 2010-12-14
    相关资源
    最近更新 更多