【问题标题】:Setting a double pointer array设置双指针数组
【发布时间】:2013-04-28 16:37:44
【问题描述】:

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

在下面的代码中,我可以通过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;
}

【问题讨论】:

  • 您的代码完全无法编译。在*queue[i] = p 中,您尝试将指针分配给整数。
  • 嗯...似乎是我的编译器,它只是一个简单的复制粘贴到这里。
  • 那么你应该得到一个合适的 C 编译器或尝试提高你的警告级别。即使它编译了,它也不会像你认为的那样做。

标签: c arrays pointers double-pointer


【解决方案1】:

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

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

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

PS。顺便说一句,这个:

*queue[i] = p;

不会编译,因为*queue[i] 的类型为int,但p 的类型为int*

【讨论】:

  • @EricFossum,未定义的行为。
  • 啊,谢谢,那么我的问题是。 void enqueue(int *p, int **queue) 正确吗?还是应该像 (int *)*queue (不能编译)?
  • 哈哈好点子,你是说*queue[i]int 类型,我怎么做int*
  • @EricFossum,嗯...不要取消引用它?
  • 天啊,现在我觉得自己很笨。可能是我在这里遇到过的最愚蠢的感觉
【解决方案2】:
// Find correct slot
while (*queue && *queue[i] >= *p) {
    i++;
}

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

int *ptrs[5] = {0};

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

【讨论】:

  • 没错。先给数组中的指针分配地址。
猜你喜欢
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
相关资源
最近更新 更多