Проблема с указателем на вложенную структуру - PullRequest
0 голосов
/ 03 апреля 2010

У меня есть общая структура, и внутри нее структура запроса:

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 ]

3 голосов
/ 03 апреля 2010

предупреждения «неявного объявления» обычно означают, что вы не включили правильный заголовок, который для strcpy является string.h.

Вместо strcpy следует использовать strlcpy, что позволяет ограничить количество копируемых символов, предотвращая переполнение буфера.

2 голосов
/ 03 апреля 2010

Похоже, что это не проблема с вложенной структурой, по крайней мере, не видя больше кода (т.е. что такое dir_path_name).

Возможно, это длинный путь, но вы включили string.h, чтобы компилятор увидел объявление strcpy?

1 голос
/ 03 апреля 2010

Halo, возможно, вам не хватает включения string.h, как говорили некоторые из других авторов. Кроме того, копирование строки, которую вы выполняете в этом поле, приведет к переполнению буфера, если dir_path_name больше, чем d_name.

Я бы вышел из состояния здоровья и предложил бы вам сделать следующее:

  1. явно проверяет, меньше ли размер исходного буфера или равен его месту назначения (и, черт возьми, ошибается, если это не так),
  2. используйте memcpy вместо str * cpy
  3. Вы установили остаток от 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);
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...