【问题标题】:Trouble with strcpy [closed]strcpy的问题[关闭]
【发布时间】:2013-04-12 17:01:36
【问题描述】:

我对 C 语言很糟糕,并且在使用 strcpy 时遇到了麻烦。我正在尝试获取其中一个函数参数并将其存储在 char 数组中。当我运行它时,我得到一个分段错误,但我不明白为什么。我究竟做错了什么?谢谢!

struct bb_state {
    FILE *logfile;
    char *rootdir;
};

struct bb_state *bb_data;
bb_data = malloc(sizeof(struct bb_state));
strcpy(bb_data->rootdir, argv[argc-2]);

【问题讨论】:

  • 需要确保指针(bb_data->rootdir) 指向的区域。
  • 您是否检查了 bb_data->rootdir 的大小。在char * strcpy ( char * destination, const char * source ) 中:为避免溢出destination 指向的数组的大小应足够长,以包含与source 相同的C 字符串(包括终止的空字符),并且不应在内存中与源重叠。

标签: c strcpy


【解决方案1】:

你必须为char* rootdir分配内存。

例子:

int len=strlen(argv[argc-2])+1;
bb_data->rootdir=malloc(len);

然后你可以这样做:

strcpy(bb_data->rootdir, argv[argc-2]);

【讨论】:

  • 如果strdup可用,它可以在一行中执行上述步骤。
【解决方案2】:

您需要为rootdir 分配空间。估计你要复制多少个字符,你可以为rootdir 再做一个malloc

确保argv 足够大,可以使用argc-2 进行索引。这也可能导致崩溃。

bb_data->rootdir = malloc(strlen(argv[argc-2]+1)); 

【讨论】:

    【解决方案3】:

    我正在尝试获取函数参数之一并将其存储在 char 数组中

    你的代码的问题是你没有一个字符 array 来存储复制的参数。你所拥有的是一个指针。您必须分配要在其中复制参数的存储空间。或者,您可以将rootdir 设为数组而不是指针,但必须小心防止副本溢出固定大小的数组。

    分配存储空间

    bb_data->rootdir = malloc(strlen(argv[argc - 2]) + 1); // +1 is for the NULL
    

    将 rootdir 设为数组

    #include <limits.h>
    #include <stddef.h>
    #include <stdlib.h>
    
    ...
    
        struct bb_state {
            FILE *logfile;
            char  rootdir [PATH_MAX];
        };
    
        struct bb_state *bb_data;
        size_t           len;
        len = strlen(argv[argc - 2]);
        if (len >= PATH_MAX) {
            // Argument is too long.
            fprintf(stderr, "Argument is too long: %s\n", argv[argc - 2]);
            return EXIT_FAILURE;
        }
        bb_data = malloc(sizeof(struct bb_state));
        strcpy(bb_data->rootdir, argv[argc - 2]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 2016-05-14
      • 2017-03-12
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      相关资源
      最近更新 更多