Я не могу редактировать экземпляр вложенной структуры в C - PullRequest
0 голосов
/ 09 ноября 2019

Мой код не работает при попытке редактировать экземпляр вложенной структуры. Код успешно компилируется, ошибки нет. Он выполняет каждую строку, но прекращает выполнение и не завершает выполнение, когда достигает второй строки ниже:

int numberOfProcess = 5;
shmem->pid_queue = createQueue(numberOfProcess);
enqueue(shmem->pid_queue, getpid()); 

Ниже приведены следующие примеры структур:

SharedData *shmem;
Queue *queue;

Xcode дает следующеепредупреждение:

Thread 1: EXC_BAD_ACCESS

Моя структура ниже

typedef struct {
    int front, rear, size;
    unsigned capacity;
    int* array;
} Queue;


typedef struct {
        int shmInt;
        int timeSec;
        int timeNanosec;
        Queue *shmMsgSec_queue;
        Queue *shmMsgNanosec_queue;
        int items_in_queue;
        sem_t mutex;
        Queue *pid_queue;
} SharedData;

Существуют функции, которые управляют очередью, показанной ниже:

Queue* createQueue(unsigned capacity)
{
     Queue* queue = ( Queue*) malloc(sizeof( Queue));
    queue->capacity = capacity;
    queue->front = queue->size = 0;
    queue->rear = capacity - 1;  // This is important, see the enqueue
    queue->array = (int*) malloc(queue->capacity * sizeof(int));
    return queue;
}

int isFull( Queue* queue)
{  return (queue->size == queue->capacity);  }

int isEmpty( Queue* queue)
{  return (queue->size == 0); }

void enqueue( Queue* queue, int item)
{
    if (isFull(queue))
        return;
    queue->rear = (queue->rear + 1)%queue->capacity;
    queue->array[queue->rear] = item;
    queue->size = queue->size + 1;
    printf("%d enqueued to queue\n", item);
}


int dequeue( Queue* queue)
{
    if (isEmpty(queue))
        return INT_MIN;
    int item = queue->array[queue->front];
    queue->front = (queue->front + 1)%queue->capacity;
    queue->size = queue->size - 1;
    return item;
}

int front( Queue* queue)
{
    if (isEmpty(queue))
        return INT_MIN;
    return queue->array[queue->front];
}

int rear( Queue* queue)
{
    if (isEmpty(queue))
        return INT_MIN;
    return queue->array[queue->rear];
}

1 Ответ

0 голосов
/ 09 ноября 2019

Ваша "вторая строка ниже" равна

shmem->... = ...

Правильно ли вы инициализировали shmem в первую очередь? Мы знаем, что это может быть нулевой или недействительный указатель.

По какой-то причине вы, кажется, зацепились за то, что ваша проблема заключается в выделении Queue, а не в том месте, где вы назначаете результирующий указатель. Кстати, в C мы не приводим результат malloc (или любой типизированный указатель void* в этом отношении) перед присваиванием.

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