2010-04-03 110 views
0

我有一个共享的结构,并且在其内部的请求结构:Ç嵌套结构指针问题

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函数不兼容的隐式声明。我想这是指针的问题,但不是我上面写的应该是真的?

+2

Did you include ? – 2010-04-03 11:28:53

+0

不,我现在做了,还没有测试过,但我想现在就可以运行了。 – Halo 2010-04-03 14:19:35

回答

2

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

这可能是一个远射,但是您是否包含string.h以供编译器查看strcpy的声明?

+0

哇,我真的没有。 – Halo 2010-04-03 14:09:34

3

“隐式声明”警告通常意味着您没有包含适当的头文件,其中strcpy为string.h。

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

1

晕,你可能会错过包含string.h,因为其他海报的说法。此外,如果dir_path_name大于d_name,则在该字段上执行的字符串复制操作将导致缓冲区溢出。

我出去肢体和建议你做到以下几点:

  1. 明确检查源缓冲区的大小小于或等于比目标(和bug的地狱,如果它是不是),
  2. 使用memcpy而不是海峡* CPY的
  3. 你memset的sdata_ptr-> request_queue [指数] .d_name的为0,其余(安全起见)

使用您的代码示例,它会作为foll行:

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

希望它有帮助。

+0

谢谢,我可以认为它不会超过250个字符。 – Halo 2010-04-03 14:10:25