strcpy周围的分段错误?

时间:2011-06-22 23:31:28

标签: c segmentation-fault strcpy

我知道你会用指关节来打我,但是。

为什么会出现分段错误

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

当这不是

char *cmd;
cmd = "plop";

我一段时间没有练习,也记不起原因。

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

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

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

谢谢!

4 个答案:

答案 0 :(得分:9)

当你这样做时:

char * cmd;

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

然后,当你这样做时:

strcpy(cmd, argv[0]);

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

执行此操作时:

cmd = "plop";

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

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

第一个是在堆栈上分配数据,如下所示:

char cmd[100]; // for instance

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

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:1)

  

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

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