0

二重ポインタに関する質問がたくさんあることは知っていますが、配列の開始に関する質問は見つかりませんでした。

以下のコードでは、 によって main にポインターを設定できますが、 を呼び出すとptrs[0] = &array[0];コードが停止します。何故ですか?問題があるかどうかはわかりませんが、ptrs[] は初期化されていません。enqueue()*queue[i] = p;

#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 を持っていますが、 typeintp持っているため、コンパイルされませんint*

于 2013-04-28T16:43:20.983 に答える