0
    #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;
    }

上面的代码工作正常,但是当我在>单独的函数function1中为word分配参数并将指针word传递给另一个双指针word>并将这个指针传递给getopt函数时,它会因段错误而崩溃。

请参阅下面的代码,该代码不起作用。程序在 >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) print word $1 = {0x804a008 "file", 0x804a018 "-aram", 0x804a028 "-braj"} (gdb) s 21 } (gdb) s

断点 2, main () at test_getopt.c:30 30 while((opt = getopt(3,words,"a:b:"))!= -1) (gdb) print words $2 = (char **) 0xffffb124 (gdb) print words[0] $3 = 0x804a008 "file" (gdb) print words[1] $4 = 0x804a018 "-aram" (gdb) print words[2] $5 = 0x804a028 "-braj"

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

4

2 回答 2

1

你的代码中有很多未定义的行为。

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

要继续,参数数组必须包含一个额外的终止元素,即指向NULL.

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

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

char *words[] = {
    "file",
    "-aram",
    "-braj",
    NULL
};
于 2013-09-19T09:24:18.617 回答
0

段错误的原因是指针和数组不相同。返回数组名称不是返回整个数组,它只是其第一个元素的地址。在第一种情况下,单词被称为数组,但在第二种情况下,返回的单词function_1只是一个指针。

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

于 2013-09-19T09:33:04.680 回答