strcpy 周围的分段错误?

Posted

技术标签:

【中文标题】strcpy 周围的分段错误?【英文标题】:Segmentation fault around strcpy? 【发布时间】:2011-09-20 19:45:02 【问题描述】:

我知道你会敲我的指关节但是。

为什么会出现分段错误

char* cmd;
strcpy(cmd, argv[0]);

如果不是这样

char *cmd;
cmd = "plop";

我有一段时间没练习了,不记得为什么了。

ps:实际上,我知道在 strcpy 之前这样的东西会更好

char *cmd = (char*) malloc(strlen(argv[0]));

但我只是想知道为什么会出现这种分段错误。

谢谢!

【问题讨论】:

What's wrong with this C (strcpy) code? 的可能重复项 ***.com/questions/9677654/… 【参考方案1】:

当你这样做时:

char * cmd;

您正在分配一个指针在堆栈上。该指针未初始化为任何有意义的值。

然后,当你这样做时:

strcpy(cmd, argv[0]);

你将argv[0]中包含的字符串复制到指向cmd的地址,这是……毫无意义的东西。既然你很幸运,它只是段错误。

当你这样做时:

cmd = "plop";

您将地址分配给cmd,并分配给静态分配的字符串常量。由于此类字符串是只读的,因此在它们上写入是未定义的行为。

那么,如何解决这个问题?为运行时分配要写入的内存。有两种方法:

第一个是在栈上分配数据,像这样:

char cmd[100]; // for instance

这会在堆栈上分配 100 个 chars 的数组。但是,它不一定是健壮的,因为您必须事先知道您需要多少内存。栈也比堆小。这导致我们选择第二个选项:

char *cmd = malloc(whatever_you_need); // no need to cast, by the way, unless you're in C++

这会在堆上分配whatever_you_needchars。完成后不要忘记使用free 释放内存。

【讨论】:

【参考方案2】:

你得到一个段。错误,因为您的第一个示例中的 cmd 没有指向任何东西(或者,更确切地说,它指向未定义的东西 - 因此尝试从指针读取字符或将字符写入指针将可能导致访问冲突)。

在第二个示例中,您将 cmd 设置为指向合法的字符字符串。

【讨论】:

【参考方案3】:

如果您想轻松复制 argv[0],

char* cmd = strdup(argv[0]);

当然,你最好检查一下 strdup 的结果是否为空。 :)

【讨论】:

【参考方案4】:

我只是想知道为什么会出现这种分段错误。

因为如果cmd是一个全局变量,它的值就是NULL,它是不可写的,如果它是一个局部变量,那么它的值是不确定的,你不应该使用它(但它可以做任何事情,如果你这样做,在许多情况下比 NULL 更糟糕)。

【讨论】:

以上是关于strcpy 周围的分段错误?的主要内容,如果未能解决你的问题,请参考以下文章

strcpy给出分段错误

使用 C (Ubuntu) 进行套接字编程中的分段错误

这段代码一次执行良好,另一次出现分段错误

将数据复制/扫描/读取到未初始化的指针时发生崩溃或“分段错误”

最简单的字符串数组c程序上的分段错误(核心转储)

为啥这段代码在 leetcode 运行良好,但在 geeksforgeeks 出现分段错误?