【发布时间】:2010-09-12 11:31:21
【问题描述】:
所以我有一些 C 代码:
#include <stdio.h>
#include <string.h>
/* putting one of the "char*"s here causes a segfault */
void main() {
char* path = "/temp";
char* temp;
strcpy(temp, path);
}
这会编译、运行并按其外观运行。但是,如果将一个或两个字符指针声明为全局变量,则 strcpy 会导致分段错误。为什么会这样?显然我对范围的理解有误。
【问题讨论】:
-
因为我认为它实际上并不能解决问题,所以我只是评论说 strncpy 比 strcpy 更推荐。
-
Josh Gagnon:实际上,当输入字符串的长度 >= 缓冲区时,strncpy 不会放置空终止符。如果您知道缓冲区足够大, strcpy 是完全安全的。否则,使用
snprintf(buffer, buffer_len, "%s", src),因为 snprintf 总是放置一个空终止符(只要确保 buffer_len > 0)。 -
@Josh:我更喜欢
strlcpy。不幸的是 glibc 不支持它,所以我没有太多机会使用它。我想我总是可以推出自己的实现并将其添加到我的空检查 malloc 和文件相关函数的个人头库中,但它仍然让我烦恼的是,许多版本的 Unix 都有它,而 Linux 通常没有。 -
事实上,我在大学的最后一个学期几乎把我搞砸了,因为我正在为我的一门课测试第四个也是最后一个作业等级的程序(我已经错过了一个作业,因为认为它应该在实际发生三天后到期)远程意外登录到 Unix 服务器而不是 Linux 服务器而不注意,并在那里编译和运行它就好了,但是考试时间到了,我收到一封来自其中一个的电子邮件班级的助教说“你的程序不会在 [Linux] 测试盒上运行或编译”。
-
(幸运的是,我已经包含了
strlcat和strncat的行 [与strlcpy和strncpy在工作方式和实现方式方面的差异相似]正在执行的操作,因此只需注释掉一行并取消注释之后的行。)...没想到会占用这么多注释框。
标签: c scope pointers segmentation-fault character