【问题标题】:Pointer incrementation指针递增
【发布时间】:2017-10-28 09:36:11
【问题描述】:
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 xint 分隔符。

不幸的是,如果我这样做,结果是以下数组:

dividers[] = {0,0,0};

这意味着自从calloc 像这样填充数组以来没有任何变化。

发生了什么

*dividers = j;
dividers++;

?

【问题讨论】:

  • 拼写为amount,而不是ammount
  • 1/ 我们无法重现该问题。这是新手的常见问题,因此请阅读本网站帮助中心内的常见问题解答以了解如何编写以允许其他人重现(并因此尝试)该问题的方式提出问题。我已经完成了直接链接到该部分的操作。如果我们要谈论礼貌,您应该在发布之前阅读整个部分。像这样无视社区标准有点粗鲁。
  • 您能否添加一些示例来说明您的函数的预期结果?
  • *(dividers+i)dividers[i] 相同。无需增加指针。

标签: c arrays pointers memory-management


【解决方案1】:

如果你在循环中增加dividers

    dividers++;

那么它最后就没有原来的值了:

return dividers;

随着增量,您的函数返回一个超过数组末尾的指针,而不是指向数组开头的指针。

解决这个问题的最简单方法是在开始时将原始指针保存在另一个变量中:

int *dividers = ...;
int *dividers_start = dividers;

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

return dividers_start;

但你也可以使用指针算法来撤销增量:

return dividers - ammount;

【讨论】:

  • 数组的值会发生什么变化?
  • @ADITYA 什么数组?
猜你喜欢
  • 1970-01-01
  • 2021-12-11
  • 2010-09-23
  • 2017-01-05
  • 1970-01-01
  • 2016-07-01
  • 2013-07-15
相关资源
最近更新 更多