在下面的示例中,为什么使用二维字符数组的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]);
}
非常感谢!
答案 0 :(得分:2)
这不是由于strcpy()
引起的-在两种情况下它都做同样的事情:它将字符从源顺序复制到目标位置的相应位置,直到\0
为止。源字符串。
在第二种情况下出现分段错误的原因是这些字符串文字现在位于内存的不同段中,该段是只读的(例如,它可能与已编译的一起程序文本)。当strcpy()
尝试在其中写入字符时,您的进程将被中断,内核会告诉您“您不能这样做,您正在违反内存分段”(因此发生分段冲突或错误)。>
在 first 情况下,那些只读的字符串文字仍然存在,但是您正在使用它们来初始化局部变量-(二维)数组,该数组位于堆栈上。二维数组不是指针数组,而是指针数组,实际上是字符数组,C只是“安排”对该数组的访问,以便您可以使用成对的方括号。>
请参阅:
在StackOverflow上,有关这些主题的更多信息。