我知道有很多双指针问题,但我找不到一个与启动数组相关的问题。
在下面的代码中,我可以通过ptrs[0] = &array[0];
在main中设置指针,但代码会在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 :(得分:0)
// Find correct slot
while (*queue && *queue[i] >= *p) {
i++;
}
这将访问取自未初始化ptrs
值的一些随机内存地址
检查* queue!= 0是不够的,你需要用zeores初始化数组:
int *ptrs[5] = {0};
您仍然需要在插入时分配稍后尝试写入的内存。
答案 1 :(得分:0)
首次循环后,i
将保持为零。这里:
if (!*queue) {
*queue[i] = p;
return;
}
您检查*queue
为0并取消引用它。这是UB。
PS。顺便说一下,这个:
*queue[i] = p;
不会编译,因为*queue[i]
的类型为int
,但p
的类型为int*
。