对指针感到困惑并将它们作为参数传递

时间:2016-10-22 15:50:29

标签: c

我试图创建一个任意大小的数组,出于某种原因,这里的代码可行:

int rand_tab(unsigned int n, int min, int max, int** dest){
    if(!(*dest = malloc(sizeof(int)*n))) return 0;
    return 1;
}

在main中生成随机数:

int* tab;
if(!(rand_tab(taille, min, max, &tab))) return -1;
for(i=0; i<taille; i++) tab[i] = random(min, max);

但这会崩溃(尽管编译得很好):

int rand_tab(unsigned int n, int min, int max, int** dest){
    if(!(*dest = malloc(sizeof(int)*n))) return 0;
    for(i=0; i<n; i++) *dest[i] = random(min, max);
    return 1;
}

因为我将&tab传递给函数,dest现在指向tab,这意味着*dest[i]应该相当于在main中编写tab[i]

如果我将*dest[i]替换为*(*dest+i),则可行。这里发生了什么?

1 个答案:

答案 0 :(得分:3)

问题是以下表达式

*dest[i] = random(min, max)

需要*dest周围的括号:

(*dest)[i] = random(min, max)

由于方括号[]运算符的优先级高于解引用运算符*,因此需要强制使用括号来匹配您需要的顺序。否则,C将dest解释为指针数组,从dest+1读取值(未定义的行为)并尝试取消引用它(未定义的行为)。