【问题标题】:Extracting string from main() arguments从 main() 参数中提取字符串
【发布时间】:2011-04-05 23:19:02
【问题描述】:

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

代码如下:

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

我收到有关试图将参数转换为 int 的指针的错误。这是因为指针实际上是一个整数地址值,我试图将它设置为一个字符串?

编辑:当我更改为“filename = argv[1]”时,我的编译器会出现以下错误:assignment discards discards from pointer target type。

【问题讨论】:

    标签: c


    【解决方案1】:

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

    问题出在这里:

    *filename = argv[1];
    

    应该是:

    filename = argv[1];
    

    为什么?你声明了一个指向char 的指针,它被统一化了,没有特别指向任何地方。然后,您取消引用该指针并将数据分配给该内存位置。这是,好吧,谁知道在哪里!

    编辑:您还在printf() 调用中取消引用filename。删除 * :)。

    另外,当您分配 *filename 时,编译器没有发出警告吗?我的猜测是从没有强制转换的指针制作整数? 注意警告,它们提供了有用的信息!

    干杯。

    【讨论】:

    • 同样printf("The filename is: %s", filename);%s 说明符需要一个字符 指针
    • 当我更改为“filename = argv[1]”时,我的编译器会出现以下错误:assignment discards qualifiers from pointer target type。
    • @Kelp:用int main(int argc, char **argv)int main(int argc, char *argv[]) 定义main。
    【解决方案2】:

    您没有让filename 指向与argv[1] 相同的位置。为此,您需要

    filename = argv[1];
    

    使用您的版本 (*filename = argv[1];),您正在尝试使任何文件名指向的文件名都具有 argv[1] 中的值。这有很多问题:a)文件名没有初始化并且可以指向任何地方,甚至是无效的位置; b) argv[1]char* 类型,而您正试图将其放入 char 类型的位置!

    【讨论】:

      【解决方案3】:

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

      将分配更改为filename = argv[1]

      【讨论】:

        【解决方案4】:

        当您尝试分配 char* 时,您正在取消对它的引用,因此您正在尝试将指针填充到 char 中。而且由于文件名未初始化,因此您正在尝试访问一些随机地址(或者可能是地址 0x00000000。如果您走到那一步,您的打印语句也将不起作用:您再次取消引用 char*(以获得char),然后告诉 printf 将其解释为指向以 nul 结尾的字符串的指针。

        试试这个:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-04-04
          • 1970-01-01
          • 2021-11-27
          相关资源
          最近更新 更多