【问题标题】:Update array elements (access using pointers) using scanf inputs in function使用函数中的 scanf 输入更新数组元素(使用指针访问)
【发布时间】:2016-07-02 08:40:54
【问题描述】:

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

所以函数看起来像这样:

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 无法写入数组。

【问题讨论】:

  • pArrptr?此外,在您的循环中,k 在最后一次传递中将是 size,这对于大小为 size 的数组不是有效索引。
  • pArr的定义在哪里?
  • for (k=0; k&lt;sizeArr; k++) { printf("please enter element number %d\n", k); scanf("%d", ptr+k); }
  • 已编辑。应该是 *(ptr+k)..但正如你们解释的那样:只是 ptr+k。

标签: c arrays function pointers scanf


【解决方案1】:

通过改变来改变你阅读元素的方式

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

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

Scanf 需要在说明符旁边有一个指针,但 ptr 已经是一个指针(ptr+k 也是如此)所以使用星号表示指针的内容而不是指针本身。

【讨论】:

    【解决方案2】:

    ptr 是指向int 的指针。

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

    scanf( "%d", &lt;some_int&gt; ) 会将存储在该int 中的数字 解释为一个地址,并尝试将用户输入的任何内容写入该“地址”。 p>

    这是未定义的行为。

    您可能想省略*,将指针变成int;那么该语句将是格式正确的。

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

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

    【讨论】:

    • 嗨。感谢您的解释和链接。我刚刚学习 C 语言,指针和数组需要一段时间才能适应。
    【解决方案3】:

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

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

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


    关于替代品的一点解释。表达式pArr[k] 为您提供数组中索引k 处的值,为了获得指向该值的指针,我们添加地址运算符&amp; 并获得&amp;pArr[k]

    由于pArr[k] 等价于*(pArr + k),那么&amp;pArr[k] 将等价于&amp;*(pArr + k),但地址和取消引用运算符相互抵消,留下pArr + k


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

    【讨论】:

    • 感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    相关资源
    最近更新 更多