使用函数中的scanf输入更新数组元素(使用指针访问)

时间:2016-03-16 12:48:33

标签: c arrays function pointers scanf

所以我有一个指针和一个数组的大小,它传递给一个要求用户输入并将用户输入存储为数组元素的函数。

所以函数看起来像这样:

int addElements(int * ptr, int sizeArr) {

int k=0;
for (k=0; k<=size; k++) {
    printf("please enter element number %d\n", k);
    scanf("%d", *(ptr+k));
}

return pArr;

}

它返回一个指针,因为我需要进一步处理数组。

我得到了

Segmentation fault (Core dumped)
将元素输入到数组时出现

错误。

我在这里做错了什么?我可以将数组元素(从随机/自动值)更新为0就好了,它只是无法写入数组的scanf。

3 个答案:

答案 0 :(得分:1)

ptr是指向int的指针。

(ptr + k)仍然是指向(不同的)int的指针。 *(ptr + k)int

scanf( "%d", <some_int> )会将int 中存储的解释为地址,并尝试将用户输入的内容写入&## 34;地址&#34;

这是未定义的行为。

您可能希望省略*将指针转换为int;那么声明就会很好。

一般来说,推荐阅读How to read / parse input in C

  • 检查scanf()的返回值,因为用户可能输入的内容不是数字。
  • 通过读取下一个换行符来满足仍在输入缓冲区中等待的非数字输入,或者后续scanf( "%d", ... )也会失败。
  • 更好的是,阅读输入的(使用fgets()),并在内存中解析它们(使用strtol()),这样您就可以从错误的输入中恢复正常。

答案 1 :(得分:1)

通过更改

修改您阅读元素的方式
scanf("%d", *(ptr+k));

scanf("%d", (ptr+k));

Scanf需要一个指针旁边的指针,但是ptr已经是一个指针(因此是ptr+k)所以通过使用星号你暗示指针的内容而不是指针本身。

答案 2 :(得分:1)

对于任何指针(或数组)pArr和索引k,表达式*(pArr + k)等同于pArr[i]

问题在于pArr[i](因此*(pArr + k))不是指针,scanf需要它才能工作。

有两种解决方案:第一种是继续使用指针算法,然后简单地删除解除引用运算符(因此只将pArr + k传递给scanf);或者使用“普通”数组索引并添加地址运算符(如&pArr[k]中所示)。

关于替代方案的一点解释。表达式pArr[k]为您提供数组中索引k的值,以获取指向该值的指针,我们添加地址运算符&并获取&pArr[k]。< / p>

由于pArr[k]相当于*(pArr + k),因此&pArr[k]等同于&*(pArr + k),但地址和解除引用运算符会相互抵消,从而导致pArr + k {1}}。

问题中显示的代码现在发生了什么,你得到索引k的值(即pArr[k]),编译器将它转换为指针(它应该给你一个虽然警告它然后scanf写入该值指向的内存。由于pArr[k]不是有效指针,因此它甚至可能未初始化(因此具有不确定值),您将具有未定义行为