strcpy周围的分段错误?

ror*_*oro 5 c segmentation-fault strcpy

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

为什么会出现分段错误

char* cmd;
strcpy(cmd, argv[0]);
Run Code Online (Sandbox Code Playgroud)

当这不

char *cmd;
cmd = "plop";
Run Code Online (Sandbox Code Playgroud)

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

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

char *cmd = (char*) malloc(strlen(argv[0]));
Run Code Online (Sandbox Code Playgroud)

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

谢谢 !

Eti*_*tel 9

当你这样做时:

char * cmd;
Run Code Online (Sandbox Code Playgroud)

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

然后,当你这样做:

strcpy(cmd, argv[0]);
Run Code Online (Sandbox Code Playgroud)

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

当你这样做:

cmd = "plop";
Run Code Online (Sandbox Code Playgroud)

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

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

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

char cmd[100]; // for instance
Run Code Online (Sandbox Code Playgroud)

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

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

这会whatever_you_need char在堆上分配s.free一旦完成,不要忘记释放内存.


Wil*_*l A 5

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

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