理解 C 中的 strcpy 和 char 数组
Understanding strcpy and char arrays in C
为什么 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]);
}
非常感谢!
这不是因为 strcpy()
- 它在两种情况下做同样的事情:它按顺序将字符从源位置复制到目标位置的相应位置,直到最后的 [=11=]
源字符串。
在第二种情况下出现分段错误的原因是那些字符串文字现在位于不同的内存段中,即 只读(例如,它可能与编译的程序文本一起)。当 strcpy()
试图在其中写入字符时,您的进程会被中断并且内核会告诉您 "You can't do that, you're violating the segmentation of memory" (因此出现分段违规或错误)。
在 first 的情况下,那些只读字符串文字仍然存在,但您正在使用它们来初始化局部变量——(二维)数组,它是位于堆栈上。二维数组不是一个指针数组,它实际上是一个字符数组,C只是"arranges"对该数组的访问,这样你就可以使用对方括号。
参见:
- String literals: Where do they go?
- How are multi-dimensional arrays formatted in memory?
- What and where are the stack and heap?
在 Whosebug 上,了解有关这些主题的更多信息。
为什么 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]);
}
非常感谢!
这不是因为 strcpy()
- 它在两种情况下做同样的事情:它按顺序将字符从源位置复制到目标位置的相应位置,直到最后的 [=11=]
源字符串。
在第二种情况下出现分段错误的原因是那些字符串文字现在位于不同的内存段中,即 只读(例如,它可能与编译的程序文本一起)。当 strcpy()
试图在其中写入字符时,您的进程会被中断并且内核会告诉您 "You can't do that, you're violating the segmentation of memory" (因此出现分段违规或错误)。
在 first 的情况下,那些只读字符串文字仍然存在,但您正在使用它们来初始化局部变量——(二维)数组,它是位于堆栈上。二维数组不是一个指针数组,它实际上是一个字符数组,C只是"arranges"对该数组的访问,这样你就可以使用对方括号。
参见:
- String literals: Where do they go?
- How are multi-dimensional arrays formatted in memory?
- What and where are the stack and heap?
在 Whosebug 上,了解有关这些主题的更多信息。