所以我有一个指针和一个数组的大小,它传递给一个要求用户输入并将用户输入存储为数组元素的函数。
所以函数看起来像这样:
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。
答案 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]
不是有效指针,因此它甚至可能未初始化(因此具有不确定值),您将具有未定义行为。