当我们将指针传递给参数时,getopt函数调用不起作用。解析字符串后获取指针

时间:2013-09-19 09:20:53

标签: c pointers getopt

    #include <stdio.h>
    # include <string.h>
    # include  <stdlib.h>
    #include <unistd.h>
    int main()
    {

    int opt;
    char *name1,*name2 ;
    char *word[3];
    word[0] = malloc(sizeof(char)*5);
    strcpy(word[0],"file");
    strcat(word[0],"\0");
    word[1] = malloc(sizeof(char)*5);
    strcpy(word[1],"-aram");
    strcat(word[1],"\0");
    word[2] = malloc(sizeof(char)*5);
    strcpy(word[2],"-braj");
    strcat(word[2],"\0");

    char **words;

    words = word;
    while((opt = getopt(3,words,"a:b:"))!= -1)
    {
    switch(opt)
    {
        case 'a':
        name1 = optarg;
        break;
        case 'b' :
        name2 = optarg;
        break;

    }
    }


    printf("a %s b %s \n",name1,name2);
    return 0;
    }
  

上面的代码工作正常,但是当我在&gt;单独的函数function1中为word分配参数并将指针字传递给另一个双指针字&gt;并将此指针传递给getopt函数时,它崩溃了segfault。

     

请看下面的代码无效。该程序在&gt; getopt中给出了分段错误。

    #include <stdio.h>
    # include <string.h>
    # include  <stdlib.h>
    #include <unistd.h>
    char ** function1()
    {
        char *word[3];
        word[0] = malloc(sizeof(char)*5);
        strcpy(word[0],"file");
        strcat(word[0],"\0");
        word[1] = malloc(sizeof(char)*5);
        strcpy(word[1],"-aram");
        strcat(word[1],"\0");
        word[2] = malloc(sizeof(char)*5);
        strcpy(word[2],"-braj");
        strcat(word[2],"\0");

    return word;


    }

    int main()
    {

        int opt;
        char *name1,*name2 ;
       char **words = function1();
       while((opt = getopt(3,words,"a:b:"))!= -1)
       {
       switch(opt)
       {
           case 'a':
           name1 = optarg;
           break;
           case 'b' :
           name2 = optarg;
           break;
           default:
           break;

    }
    }

    printf("a %s b %s \n",name1,name2);
    return 0;
 }
  

请参阅下面的gdb调试输出,它显示单词和单词相同。

     

(gdb)打印字      $ 1 = {0x804a008“file”,0x804a018“-aram”,0x804a028“-braj”}      (gdb)s      21}      (gdb)s

     

断点2,test_getopt.c上的main():30      30 while((opt = getopt(3,words,“a:b:”))!= -1)     (gdb)打印文字      $ 2 =(char **)0xffffb124      (gdb)打印单词[0]      $ 3 = 0x804a008“文件”      (gdb)打印单词[1]      $ 4 = 0x804a018“-aram”      (gdb)打印文字[2]      $ 5 = 0x804a028“-braj”

     

有些人请告诉我,当我们从另一个函数获取参数指针&gt;并将其传递给getopt时会有什么不同。

2 个答案:

答案 0 :(得分:1)

您的代码中有许多未定义的行为。

例如,字符串"-braj"六个字符,因为它还包含终止'\0',所以当你strcpy时,你写的超出了分配内存。哦,顺便说一句,strcpy添加终止符,无需手动添加。并且不需要在堆上分配这些字符串,只需使用指针就足够了。在讨论堆分配时,您忘记了free它们。在这种情况下没什么大不了的,但可能是你在其他程序中使用它。

要继续,参数数组必须包含一个指向NULL的额外终结符元素。

在第二个版本中,你在一个函数中创建这个数组,你将返回一个指向这个数组的指针,这个指针不起作用,因为一旦离开声明它们的作用域,局部变量就无效了。

相反,就在调用getopt之前,只需将其声明为:

char *words[] = {
    "file",
    "-aram",
    "-braj",
    NULL
};

答案 1 :(得分:0)

段错误的原因是指针和数组不相同。返回数组名称不返回整个数组,它只是第一个元素的地址。在第一种情况下, word 是众所周知的数组,但在第二种情况下,从function_1返回的 word 只是一个指针。

为了更好地理解,请参考Arrays and Pointers