0

我知道有很多双指针问题,但我找不到与启动数组有关的问题。

在下面的代码中,我可以在 main by 中设置指针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;
}
4

2 回答 2

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

这将访问取自未初始化ptrs值的一些随机内存地址。
您对 *queue != 0 的检查还不够,您需要使用 zeores 将数组初始化为:

int *ptrs[5] = {0};

而且您仍然需要在插入时分配稍后尝试写入的内存。

于 2013-04-28T16:40:36.993 回答
0

第一次循环后,i将保持为零。这里:

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

你检查一下,那*queue是 0 并取消引用它。是UB。

PS。顺便说一句,这个:

*queue[i] = p;

不会编译,因为*queue[i]有 type int,但是p有 type int*

于 2013-04-28T16:43:20.983 回答