我想改变argv
C中的值,但是我遇到了分段错误.这是代码.
#include#include int main(int argc, char **argv) { for (int i = 1; argv[i]; i++) { char *val; printf("before: %d %s\n", i, argv[i]); argv[i] = "bar=foo"; printf("after: %d %s\n", i, argv[i]); char *arg = argv[i]; val = strchr(arg, '='); *val = '\0'; } return 0; }
我正在传递参数foo=bar
(并尝试将其更改为第11行bar=foo
).输出如下所示:
before: 1 foo=bar after: 1 bar=foo
因此,实际上会进行修改,但该行*val = '\0';
会导致分段错误.
有人能告诉我为什么会这样,我怎么能阻止它?
您argv[i]
指向一个字符串文字,这是一个只读字符数组.然后,您尝试修改此只读数组,从而导致未定义的行为.
你应该使用const char *
字符串文字是有原因的.
有几种方法可以解决您的问题.第一个也是最简单的,特别是如果你要使用的所有参数相同的字符串(除了在一个人为的例子不太可能如您展示一个)是使用数组一样char argument[] = "bar=foo";
.依靠数组的自然衰减指向其第一个参数的指针,您可以在赋值中使用它argv[i]
,并将数组修改为您的内容.
但就像我说的那样,除了简单的例子之外,它不会真正有用.这使得我们有其他选项,例如使用strdup
动态分配并复制字符串(或者,如果strdup
不可用,这不是一个标准的功能,你可以手动使用malloc
和strcpy
).既然您已经动态分配了内存,那么它也可以修改为您的内容.这里的问题是你需要跟踪原始指针并使用free
它们再次释放它们.
所以这些基本上是你可以使用的两个解决方案.一个是不现实的,另一个有动态内存分配和所有需要的问题.对你的问题确实没有好处,特别是没有简单的解决方案.