2011-04-05 88 views
5

我正尝试在我的程序中创建一个指向main()参数之一的指针。 我设置了初始指针,然后将其设置为等于数组中的第二个元素,但是当我尝试编译时发生错误,分段错误。这是否因为指针指向错误的地址而发生?从main()参数中提取字符串

下面是代码:

char *filename; 
*filename = argv[1]; 
printf("The filename is: %s", *filename); 

我得到的指针错误尝试投放参数为int。这是因为指针实际上是一个整数地址值,我试图设置它等于一个字符串?

编辑:当我改变到“文件名= argv的[1]”,然后从我的编译器得到以下错误:分配丢弃了指针目标类型的限定。

回答

7

编译时可能不会发生分段错误。除非编译器违反内存安全性,否则不太可能。我会认为它在您运行该程序时发生:D。

的问题是在这里:

*filename = argv[1]; 

它应该是:

filename = argv[1]; 

为什么?你宣布一个指向char的单元化,特别是无处可逃。然后,你指向取消引用那个指针并将数据分配给那个内存位置。这是谁知道在哪里!

编辑:你还提领filenameprintf()通话。删除那* :)。

此外,didnt”编译器拍摄警告,当你指定*文件名?从指针没有演员制作整数,将是我的猜测? 注意警告,他们提供有用的信息!

干杯。

+1

同样'的printf( “文件名是:%S”,文件名);'。 '%s'说明符需要一个字符*指针*。 – dmckee 2011-04-05 23:26:29

+0

当我更改为“文件名= argv [1]”,然后从我的编译器中得到以下错误:赋值放弃指针目标类型的限定符。 – Kelp 2011-04-05 23:46:31

+1

@Kelp:用main int(int argc,char ** argv)或int main(int argc,char * argv [])'定义main。 – pmg 2011-04-05 23:59:05

3

在语句*filename = argv[1];中,表达式*filename尝试取消引用(找到指向的值)filename指针,该指针尚未指向任何有意义的地方。

分配更改为filename = argv[1]

4

你没有将filename指向同一个地方作为argv[1]。要做到这一点,你需要

filename = argv[1]; 

随着您的版本(*filename = argv[1];)你想做出力所能及的文件名点有一个是argv中值[1]。这里有很多错误的地方:a)文件名不被初始化,并且可以指向任何地方,甚至无效位置; b)argv[1]的类型为char*,您正试图将其放入类型为char的位置!

0

你提领该字符*当你尝试分配它,所以你要东西的指针到一个char。并且由于文件名是未初始化的,所以你试图命中一些随机地址(或者地址0x00000000。而你的打印语句,如果你有这么多,也不会工作:你再次解引用char *(得到一个字符),然后告诉printf将它解释为一个指向nul结尾字符串的指针。

尝试这种情况:

char *filename ; 
filename = argv[1] ; 
printf("The filename is: %s" , filename) ;