我有一个共享结构,里面有一个请求结构:
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函数中执行了一个不兼容的隐式声明。我猜这是指针的一个问题,但不是我上面写的应该是真的吗?
答案 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,则对该字段执行的字符串复制将导致缓冲区溢出。
我会走出困境并建议你做以下事情:
使用您的代码示例,它将如下所示:
/* 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);
}
希望它有所帮助。