5

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

为什么会导致分段错误

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

当这不

char *cmd;
cmd = "plop";

好久没练了,不记得为什么了。

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

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

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

谢谢 !

4

4 回答 4

10

当你这样做时:

char * cmd;

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

然后,当你这样做时:

strcpy(cmd, argv[0]);

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

当你这样做时:

cmd = "plop";

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

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

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

char cmd[100]; // for instance

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

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

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

于 2011-06-22T23:42:17.660 回答
5

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

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

于 2011-06-22T23:34:54.573 回答
4

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

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

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

于 2011-06-23T00:34:55.927 回答
1

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

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

于 2011-06-22T23:35:25.070 回答