【问题标题】:C Nested Structure Pointer ProblemC 嵌套结构指针问题
【发布时间】:2010-04-03 11:26:37
【问题描述】:

我有一个共享结构,里面有一个请求结构:

struct shared_data {
    pthread_mutex_t th_mutex_queue;

    struct request_queue {
        int min;
        int max;
        char d_name[DIR_SIZE];
        pid_t pid;
        int t_index;
    } request_queue[BUFSIZE];

    int count;

    int data_buffer_allocation[BUFSIZE];
    int data_buffers[BUFSIZE][100];
};

然后我准备一个请求;

struct shared_data *sdata_ptr;
...
...
sdata_ptr->request_queue[index].pid = pid;
strcpy(sdata_ptr->request_queue[index].d_name, dir_path_name);
sdata_ptr->request_queue[index].min = min;
sdata_ptr->request_queue[index].max = max;

编译器警告我,我在 strcpy 函数中做了不兼容的隐式声明。我想这是指针的问题,但我上面写的不应该是真的吗?

【问题讨论】:

  • 不,我现在做了,还没有测试,但我想它现在可以工作了。

标签: c pointers structure


【解决方案1】:

“隐式声明”警告通常意味着您没有包含正确的标题,对于strcpy,它是 string.h。

您应该使用strlcpy 而不是strcpy,它可以限制复制的字符数,防止缓冲区溢出。

【讨论】:

    【解决方案2】:

    嵌套结构似乎没有问题,至少没有看到更多代码(即dir_path_name 是什么)。

    这可能是一个很长的镜头,但您是否包含string.h 以便编译器查看strcpy 的声明?

    【讨论】:

      【解决方案3】:

      Halo,您可能没有像其他一些发帖人所说的那样包含 string.h。此外,如果 dir_path_name 大于 d_name,您在该字段上进行的字符串复制将导致缓冲区溢出。

      我会竭尽全力建议您执行以下操作:

      1. 明确检查源缓冲区的大小是否小于或等于目标缓冲区(如果不是,则出局),
      2. 使用 memcpy 代替 str*cpy
      3. 你 memset sdata_ptr->request_queue[index].d_name 的剩余部分为 0(安全起见)

      使用您的代码示例,它会如下所示:

      /* dir_path_name should be null-terminated for this to work */
      size_t path_len = strlen(dir_path_name);
      char * dest = sdata_ptr->request_queue[index].d_name;
      size_t n = strlen(dest);
      
      if( path_len >= n )
      {
        ... err out, no workie
      }
      
      memcpy(dest, dir_path_name, n );
      
      if( path_len < n )
      {
        memset((dest+n),0,n-path_len);
      }
      

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-23
        • 1970-01-01
        相关资源
        最近更新 更多