我试图创建一个任意大小的数组,出于某种原因,这里的代码可行:
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)
,则可行。这里发生了什么?
答案 0 :(得分:3)
问题是以下表达式
*dest[i] = random(min, max)
需要*dest
周围的括号:
(*dest)[i] = random(min, max)
由于方括号[]
运算符的优先级高于解引用运算符*
,因此需要强制使用括号来匹配您需要的顺序。否则,C将dest
解释为指针数组,从dest+1
读取值(未定义的行为)并尝试取消引用它(未定义的行为)。