C嵌套结构指针问题

时间:2010-04-03 11:26:38

标签: c pointers structure

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

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函数中执行了一个不兼容的隐式声明。我猜这是指针的一个问题,但不是我上面写的应该是真的吗?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

Halo,你可能会错过包括string.h,正如其他一些海报所说的那样。此外,如果dir_path_name大于d_name,则对该字段执行的字符串复制将导致缓冲区溢出。

我会走出困境并建议你做以下事情:

  1. 显式检查源缓冲区的大小是否小于或等于目标(如果不是,那么就会出错),
  2. 使用memcpy而不是str * cpy
  3. 你将sdata_ptr-> request_queue [index] .d_name的剩余部分设置为0(安全播放)
  4. 使用您的代码示例,它将如下所示:

    /* 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);
    }
    

    希望它有所帮助。