【问题标题】:Understanding strcpy and char arrays in C理解 C 中的 strcpy 和 char 数组
【发布时间】:2019-08-22 01:43:22
【问题描述】:

为什么 strcpy 在以下使用二维字符数组的示例中起作用:

int main(void) {
    char words[2][6] = {"Hello", "World"};
    strcpy(words[0], words[1]);
    printf("%s \n", words[0]);
}

但是在这个使用指向 char 数组的指针数组的示例中会导致分段错误:

int main(void) {
    char * words[2] = {"Hello", "World"};
    strcpy(words[0], words[1]);
    printf("%s \n", words[0]);
}

非常感谢!

【问题讨论】:

  • 哦,好吧 - 在第一种情况下,它们不是字符串文字?

标签: c pointers strcpy


【解决方案1】:

这不是因为strcpy() - 它在两种情况下都做同样的事情:它按顺序将字符从源复制到目标位置的相应位置,直到源字符串末尾的\0。

在第二种情况下出现分段错误的原因是这些字符串文字现在位于不同的内存段中,只读(例如,它可能与编译后的程序文本)。当strcpy() 尝试在其中写入字符时,您的进程会被中断,内核会告诉您“您不能这样做,您违反了内存分段”(因此是分段违规或错误)。

在 first 的情况下,那些只读字符串文字仍然存在,但您正在使用它们来初始化一个局部变量 - 位于堆栈上的(二维)数组。二维数组不是一个指针数组,它实际上是一个字符数组,而 C 只是“安排”了对该数组的访问,以便您可以使用成对的方括号。

见:

在 StackOverflow 上,了解有关这些主题的更多信息。

【讨论】:

  • 这是有道理的。另一方面,在第一种情况下(二维字符数组),字符串存储在哪里?
  • @Ishmael7:我说“位于堆栈上”...我已经添加了一个链接。
猜你喜欢
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多