2013-04-28 6 views
0

Я знаю, что есть много вопросов с двумя указателями, но я не мог найти тот, который относился к началу массива.Установка массива с двумя указателями

В приведенном ниже коде я могу установить указатели в основном на ptrs[0] = &array[0];, но код останавливается, когда enqueue() звонит *queue[i] = p;. Почему это? Я не знаю, имеет ли это значение, но ptrs [] не инициализируется.

#define QUEUE_LEN 5 

int *ptrs[5]; 
int array[5] = {1,2,3,4,5}; 

void enqueue(int *p, int **queue) { 
    int i = 0; 
    int *tmp; 

    // Find correct slot 
    while (*queue && *queue[i] >= *p) { 
     i++; 
    } 

    // Error no free slots 
    if (i == QUEUE_LEN) { 
     printf("No free slots.\r\n"); 
     return; 
    } 

    // Insert process 
    if (!*queue) { 
     *queue[i] = p; 
     return; 
    } 
    else { 
     tmp = *queue[i]; 
     *queue[i] = p; 
    } 

    // Increment the other processes 

    return; 
} 

int main(int argc, char** argv) { 

    int i; 
    for (i=0; i<5; i++) { 
     enqueue(&array[i], ptrs); 
    } 

    for (i=0; i<QUEUE_LEN; i++) 
     printf("%d\n", *(ptrs[i])); 

    return 0; 
} 
+0

Ваш код прямо не компилируется. В '* queue [i] = p' вы пытаетесь назначить указатель на целое число. – pmr

+0

Хм ... кажется, компилируется на моем, и здесь была простая копия. –

+0

Затем вы должны получить правильный компилятор C или попытаться вывести уровень предупреждения на ваш. И даже если он компилируется, он не делает того, что, по вашему мнению, делает. – pmr

ответ

0

После первого цикла i останется равным нулю. Здесь:

if (!*queue) { 
    *queue[i] = p; 
    return; 
} 

Вы проверяете, что *queue является 0 и разыменования его, а также. Это UB.

PS. Кстати, это:

*queue[i] = p; 

не будет компилирует, поскольку *queue[i] имеет тип int, но p имеет тип int*.

+0

Что вы подразумеваете под "UB"? –

+0

@ EricFossum, Неопределенное поведение. – soon

+0

Ahh спасибо, так что мой вопрос будет. Правильно ли void enqueue (int * p, int ** queue)? Или это должно быть как (int *) * очередь (которая не компилируется)? –

0
// Find correct slot 
while (*queue && *queue[i] >= *p) { 
    i++; 
} 

Это позволит получить доступ к какой-то случайный адрес памяти, взятый из неинициализированного ptrs значения. !
Ваша проверка * очереди = 0 не достаточно, вы должны инициализировать массив с zeores как:

int *ptrs[5] = {0}; 

И вам все еще нужно выделить память, которую вы пытаетесь написать позже при вставке.

+0

Точно. Сначала назначьте адреса указателям в массиве. – Fred

Смежные вопросы