gpt4 book ai didi

c - strcpy 周围的段错误?

转载 作者:太空狗 更新时间:2023-10-29 14:50:29 24 4
gpt4 key购买 nike

我知道你会责备我,但是。

为什么会出现Segmentation fault

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

关于c - strcpy 周围的段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6447744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com