int* dividers_of(int x, int ammount){
int i,j = 1;
int* dividers = (int*)calloc(ammount,sizeof(int)); /* calloc initializes int array to 0!*/

for(i=0;i<ammount;i++){

    while( (x%j) != 0){
        j++;
    }

*(dividers+i) = j;

/*DOESNT WORK ( int* dividers stays on 0-0-0)
*dividers = j;
dividers++; */

j++;
}
return dividers;
}

我试图找出不起作用的代码有什么问题,我将int j分配给*dividers,然后使dividers指向它数组中的下一个int。结果应该是指向包含int分隔符的数组的指针。
不幸的是,如果我这样做,结果是以下数组:
dividers[] = {0,0,0};

这意味着自从int x像这样填充数组之后,一切都没有改变。
发生了什么
*dividers = j;
dividers++;

?

最佳答案

如果在循环中增加dividers

    dividers++;

那么它最后就没有了原来的价值:
return dividers;

随着增量的增加,函数返回一个超过数组末尾的指针,而不是指向数组开头的指针。
解决此问题的最简单方法是在开始时将原始指针保存在另一个变量中:
int *dividers = ...;
int *dividers_start = dividers;

/* ... modify dividers here ... */

return dividers_start;

但也可以使用指针算术来撤消增量:
return dividers - ammount;

10-05 19:56