首页 > 解决方案 > 理解 C 中的 strcpy 和 char 数组

问题描述

为什么 strcpy 在以下示例中使用 2d 字符数组起作用:

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]);
}

非常感谢!

标签: cpointersstrcpy

解决方案


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

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

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

看:

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


推荐阅读