strcpy周围的分段错误?

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

为什么会出现分段错误

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

当这不

 char *cmd; cmd = "plop"; 

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

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

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

但我只是想知道为什么这个分段错误。

谢谢 !

当你这样做时:

 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释放内存。

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

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

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

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

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

我只是想知道为什么这个分段错误。

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