#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时会有什么不同。
答案 0 :(得分:1)
您的代码中有许多未定义的行为。
例如,字符串"-braj"
是六个字符,因为它还包含终止'\0'
,所以当你strcpy
时,你写的超出了分配内存。哦,顺便说一句,strcpy
添加终止符,无需手动添加。并且不需要在堆上分配这些字符串,只需使用指针就足够了。在讨论堆分配时,您忘记了free
它们。在这种情况下没什么大不了的,但可能是你在其他程序中使用它。
要继续,参数数组必须包含一个指向NULL
的额外终结符元素。
在第二个版本中,你在一个函数中创建这个数组,你将返回一个指向这个数组的指针,这个指针不起作用,因为一旦离开声明它们的作用域,局部变量就无效了。
相反,就在调用getopt
之前,只需将其声明为:
char *words[] = {
"file",
"-aram",
"-braj",
NULL
};
答案 1 :(得分:0)
段错误的原因是指针和数组不相同。返回数组名称不返回整个数组,它只是第一个元素的地址。在第一种情况下, word 是众所周知的数组,但在第二种情况下,从function_1
返回的 word 只是一个指针。
为了更好地理解,请参考Arrays and Pointers。