我知道你会说唱我的指关节,但是。关于strcpy的分割错误?
结果为什么分段故障
char* cmd;
strcpy(cmd, argv[0]);
时不
char *cmd;
cmd = "plop";
我因为虽然没练了,不记得为什么。
PS:其实,我知道,这样的事情,在之前strcpy的,效果会更好
char *cmd = (char*) malloc(strlen(argv[0]));
,但我只是想知道为什么这种分段错误。
谢谢!
我知道你会说唱我的指关节,但是。关于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
S中的堆栈上的阵列。然而,它不一定强大,因为你必须提前知道你需要多少内存。堆栈也比堆小。这使我们选择号码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设置为指向一个合法的字符串。
我只是想知道为什么这个分割错误。
因为如果cmd
是一个全局变量,它的值是NULL
,这是不写,如果它是一个局部变量,那么它的价值是不确定的,你不应该使用它(但如果你可以做任何事在许多情况下,这比NULL更糟糕)。
可能重复[此C(strcpy)代码有什么问题?](http://stackoverflow.com/questions/9677654/whats-wrong-with-this-c-strcpy-code) – 2012-03-13 03:18:00
http: //stackoverflow.com/questions/9677654/whats-wrong-with-this-c-strcpy-code – 2012-03-13 03:18:08