当前位置:  开发笔记 > 编程语言 > 正文

改变argv后的C分段错误

如何解决《改变argv后的C分段错误》经验,为你挑选了1个好方法。

我想改变argvC中的值,但是我遇到了分段错误.这是代码.

#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';会导致分段错误.

有人能告诉我为什么会这样,我怎么能阻止它?



1> Some program..:

argv[i]指向一个字符串文字,这是一个只读字符数组.然后,您尝试修改此只读数组,从而导致未定义的行为.

你应该使用const char *字符串文字是有原因的.


有几种方法可以解决您的问题.第一个也是最简单的,特别是如果你要使用的所有参数相同的字符串(除了在一个人为的例子不太可能如您展示一个)是使用数组一样char argument[] = "bar=foo";.依靠数组的自然衰减指向其第一个参数的指针,您可以在赋值中使用它argv[i],并将数组修改为您的内容.

但就像我说的那样,除了简单的例子之外,它不会真正有用.这使得我们有其他选项,例如使用strdup动态分配并复制字符串(或者,如果strdup不可用,这不是一个标准的功能,你可以手动使用mallocstrcpy).既然您已经动态分配了内存,那么它也可以修改为您的内容.这里的问题是你需要跟踪原始指针并使用free它们再次释放它们.

所以这些基本上是你可以使用的两个解决方案.一个是不现实的,另一个有动态内存分配和所有需要的问题.对你的问题确实没有好处,特别是没有简单的解决方案.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有