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

У меня есть такая структура;

#define BUFSIZE 10
struct shared_data {
    pthread_mutex_t th_mutex_queue;
    int count;

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

и я хочу выделить один из data_buffers для процесса, для этого я выполняю следующую функцию:

int allocate_data_buffer(int pid) {
    int i;
    for (i = 0; i < BUFSIZE; i++) {
        if (sdata_ptr->data_buffer_allocation[i] == NULL) {
            sdata_ptr->data_buffer_allocation[i] = pid;
            return i;
        }
    }
    return -1;
}

но компилятор предупреждает меня, что я сравниваю указатель на значение. Когда я ставлю & перед sdata_ptr, он успокаивается, но я не уверен, будет ли он работать. Разве то, что я написал выше, не должно быть правдой?

Ответы [ 3 ]

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

Вероятно, потому что NULL - это # ​​define'd быть (void*)0, что означает

 if (sdata_ptr->data_buffer_allocation[i] == NULL) {

будет сравнивать int с указателем. Вместо этого измените его на 0.

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

NULL - это «нулевой указатель», но data_buffer_allocation - это массив int.Вы должны сравнить с 0:

    if (sdata_ptr->data_buffer_allocation[i] == 0) {
0 голосов
/ 03 апреля 2010

Поскольку у вас нет массива указателей, сравнение с NULL является некорректным (хотя в конечном итоге оно разрешится до 0).

Чтобы сравнение было действительным, вам нужно сравнить каталог с нулем. Однако имейте в виду, что получение вашего массива НЕ инициализирует значения, поэтому в вашем массиве будет случайный мусор для начала. В результате сравнение с нулем (если вы не инициализировали свои значения на ноль в другом месте) будет непоследовательным и бесполезным.

Кроме того, это может быть придирчиво, но когда я слышу такой метод / функцию, как allocate_data_buffer, я думаю о приобретении ресурса, например, требующем new или new[]. Ваше имя метода и использование NULL и тому подобное, похоже, указывают на то, что этот код изначально предназначался для фактического использования указателей для этого распределения, но, возможно, был изменен. Чтобы модификация была «полной», по моему мнению, я бы продолжил, создав правильную инициализацию и имена методов.

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