【问题标题】:Segmentation fault when using strcpy() with pointer to cstring使用带有指向 cstring 的指针的 strcpy() 时出现分段错误
【发布时间】:2013-11-18 02:05:54
【问题描述】:
int main(int argc, char* argv[]){

    // checked for right number of arguments

    // reading pack name
    char* filename[MAX_STR_LEN];
    strcpy(*filename, argv[1]);  // seg fault here
}

【问题讨论】:

    标签: c++ pointers segmentation-fault strcpy c-strings


    【解决方案1】:
    char* filename[MAX_STR_LEN];
    

    这声明了一个指针数组,并没有将它们初始化为指向任何东西。取消引用它们会产生未定义的行为;如果幸运的话,是分段错误。

    您可能打算声明一个字符数组来包含字符串:

    char filename[MAX_STR_LEN];
    strcpy(filename, argv[1]);
    

    现在你只需要确保数组足够大;或者停止使用低级 C 工件并改用std::string

    【讨论】:

      【解决方案2】:
      char filename[MAX_STR_LEN] // without the * 
      strcpy(filename, argv[1]); // without the *
      

      更好(避免堆栈溢出!(大声笑)):

      strncpy( filename, argv[1], sizeof(filename)-1 );
      filename[ sizeof(filename)-1 ] = 0; 
      

      【讨论】:

      • 防止堆栈损坏是一个有价值的目标,但用损坏的数据替换它是不值得的。 strncpy 很难正确使用。只需使用strlen 并在数组太小时给出错误消息;如果没问题,strcpy
      • @PeteBecker 我不喜欢损坏的数据,必要时会使用 strlen + 错误消息。我使用 strncpy 可能有什么问题?
      • 没有直接的方法来检查副本是否被截断,所以你最终不得不打电话给strlen
      【解决方案3】:

      1) 文件名是一个 *char 数组。我不确定这就是你想要做的。你可能想拥有

      char filename[FOO];
      

      2) strcpy 需要一个 (char *, const char *),您正在传递它,但这里没有为您分配空间,请参阅 (1)

      【讨论】:

        【解决方案4】:

        应该是

        char filename[MAX_STR_LEN];
        .
        .
        strcpy(filename, argv[1]);
        

        或者更好

        snprintf(filename, sizeof(filename), "%s", argv[1]);
        

        【讨论】:

        • @Pete Becker,是的 - 你是对的。文件名需要声明为一个字符数组。
        • 注意,snprintf 可能会给你一个没有最后 0 的字符串。使用 sizeof(filename)-1
        • @manuell - snprintf 最多复制n-1 个字符,因此可以给出数组的确切大小。但它不会告诉你文件名被截断了,所以它并不是很有帮助。只需从strlen 开始,看看缓冲区是否足够大。如果是,请复制字符。如果不是,请给出错误消息并且不要复制。
        • @manuell,OpenBSD 手册页说它最多会写入 size-1 字符,后跟 null。
        • @ArunTaylor 我的错!我正在阅读 _snprintf 的 Microsoft 文档... ==>[]
        猜你喜欢
        • 2020-09-26
        • 2013-03-31
        • 1970-01-01
        • 2018-02-17
        • 2015-09-10
        • 1970-01-01
        • 1970-01-01
        • 2018-09-11
        • 1970-01-01
        相关资源
        最近更新 更多