我正在尝试创建一个指向程序中某个main()参数的指针。 我设置了初始指针,然后我将它设置为等于数组中的第二个元素,但是当我尝试编译时出现错误,分段错误。这是因为指针指向错误的地址吗?
以下是代码:
char *filename;
*filename = argv[1];
printf("The filename is: %s", *filename);
我得到关于指针试图将参数转换为int的错误。这是因为指针实际上是一个整数地址值,我试图将它设置为等于字符串吗?
编辑:当我更改为“filename = argv [1]”时,我从编译器中得到以下错误:赋值从指针目标类型中丢弃限定符。
答案 0 :(得分:7)
编译时不可能发生分段错误。除非,编译器违反了内存安全性,这是不太可能的。我会认为当你运行程序时会发生这种情况:D。
问题在于:
*filename = argv[1];
应该是:
filename = argv[1];
为什么呢?你声明了一个指向char
的指针,这个指针是单一的,特别是没有任何意义。然后,您取消引用该指针并将数据分配到该内存位置。哪个,谁知道谁在哪里!
修改:您还在filename
来电中取消引用printf()
。删除*
:)。
另外,没有'编译器在你指定* filename时发出警告?在没有演员表的情况下从指针制作整数,我猜是什么? 注意警告,它们提供了有用的信息!
干杯。
答案 1 :(得分:4)
您没有将filename
指向与argv[1]
相同的位置。要做到这一点,你需要
filename = argv[1];
使用您的版本(*filename = argv[1];
),您尝试将任何文件名点设为argv [1]中的值。这有很多错误:a)文件名未初始化,可以指向任何地方,甚至是无效的位置; b)argv[1]
属于char*
类型,您正试图将其放入char
类型的位置!
答案 2 :(得分:3)
在语句*filename = argv[1];
中,表达式*filename
尝试取消引用(找到指向的值)filename
指针,该指针尚未指向任何有意义的指针。
将作业更改为filename = argv[1]
。
答案 3 :(得分:0)
当您尝试分配char时,您将取消引用char *,因此您尝试将指针填充到char中。因为文件名是未初始化的,所以你试图点击一些随机地址(或者可能是地址0x00000000。而你的print语句,如果你到那么远,也不会工作:你再次取消引用char *(得到一个char)然后告诉printf将其解释为指向以空字符结尾的字符串的指针。
试试这个:
char *filename ;
filename = argv[1] ;
printf( "The filename is: %s" , filename ) ;