【问题标题】:Linux segmentation faultLinux 分段错误
【发布时间】:2014-04-09 01:11:22
【问题描述】:

当我运行这个程序时,我遇到了分段错误,我找不到它的来源。 我不知道如何处理它。 你能帮帮我吗?

这是我的代码。

    #include <stdio.h>
    #include <string.h>

    static int func(int argc, char * argv[])
    {
      char msg[500]="sdfsdf";

      argv[0]="sdf grgrg";

      printf("%s",argv[0]);

      argv[0]='\0';

      strcpy(argv[0],msg);

      printf("%s",argv[0]);

      return 0;
    }

    int main(int argc, char* argv[])
    {
      func(argc, argv);
      //printf("sdfasf");
    }

【问题讨论】:

    标签: linux c segmentation-fault


    【解决方案1】:

    让我们关注这些行。

    argv[0]='\0';
    strcpy(argv[0],msg);
    

    这里是argv[0]无关紧要,所以我引入一个变量:

    char *var = '\0';
    strcpy(var, msg);
    

    然后,回想一下 '\0' 是一个值为零的整数文字,所以当它被分配给一个指针变量时,它变成了一个空指针:

    char *var = NULL;
    strcpy(var, msg);
    

    我们可以内联变量:

    strcpy(NULL, msg);
    

    哎呀!不要那样做。这会崩溃,或者更糟——它可能不会崩溃。

    【讨论】:

    • 实际上这是错误的,因为argv[0]='\0' 确实将'\0' 分配给argv 指向的位置,而char *var='\0' 创建了一个指向NULL 的char 指针。所以strcpy(NULL,msg) 是与strcpy(argv[0],msg) 不同(顺便说一句strcpy 需要字符指针而不是argv[0],这是一个字符)或者我在这里完全错了吗? :D
    • @Uroc327:是的,你在这里完全错了(因为你问了......)。请记住argv 的类型为char **,而不是char *,因此argv[0] 的类型为char *
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 2016-11-10
    • 2017-10-05
    相关资源
    最近更新 更多