C: 为什么数组的元素需要通过内存地址扫描?

标签 c arrays pointers pass-by-reference character-arrays

(C 初学者警报)

我想从用户那里读入一些整数并将它们存储在一个数组中。所以:

int main (void)
{

int i, num, cont = 0;
int arre[10];

for (int i=0;i<5;i++)
{
    scanf("%d", arre[i]);

etc.

当我运行它时,我在 OSX 上遇到了 Segmentation Fault 11。如果我用 Valgrind 运行它,当我输入第一个整​​数时就会出现问题,它会告诉我:

==1610== Command: ./ArraysAndPointers
==1610== 
2
==1610== Use of uninitialised value of size 8
==1610==    at 0x18F0BA: __svfscanf_l (in /usr/lib/system/libsystem_c.dylib)
==1610==    by 0x18718A: scanf (in /usr/lib/system/libsystem_c.dylib)
==1610==    by 0x100000F2D: main (ArraysAndPointers.c:11)
==1610== 
==1610== Invalid write of size 4
==1610==    at 0x18F0BA: __svfscanf_l (in /usr/lib/system/libsystem_c.dylib)
==1610==    by 0x18718A: scanf (in /usr/lib/system/libsystem_c.dylib)
==1610==    by 0x100000F2D: main (ArraysAndPointers.c:11)
==1610==  Address 0x0 is not stack'd, malloc'd or (recently) free'd

如果我在 arre[i] 前面添加一个 &,if 就解决了这个问题。但我不知道为什么。我正在努力解决我正在读取整数,但(显然)将其内存地址存储在数组中的事实。然而,当我检查它出现在结果数组中的值时,它是 int 本身,而不是内存地址。为什么会这样?

注意:我基本上很难掌握指针/内存地址及其与数组、char* 等的关系(请参阅 my other questions),尽管我没有接受过不同提供商的几个 C 培训模块并在线观看了各种解释,但我'我还没有遇到可以为我确定概念的人。特别是,我很想知道何时 以及为什么 需要指针。如果有人能为我推荐一个好的引用/视频/教程/文章,我将不胜感激。

最佳答案

为了便于解释,我们将此处的 i 替换为 0。

scanf("%d", arre[0]);

此代码转到数组,查找第一个元素,发现它是 17(或其他),因此它将 17 作为第二个参数传递给 scanf()。但是 scanf() 需要一个指针,所以当它看到 17 时它会非常困惑并最终导致应用程序崩溃。

scanf("%d", &arre[0]);

此代码计算数组中第一个元素的位置,并将该指针传递给scanf()scanf() 愉快地将一个值写入该指针寻址的内存。

关于C: 为什么数组的元素需要通过内存地址扫描?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30174365/

相关文章:

c - 在 C 中从 wchar_t* 构造一个 char* 所需的大小

c++ - 通过 C++ 运行命令时隐藏控制台窗口

c++ - 如何轻松学习数组数据库 Rasdaman?

python - 将csv读取到数组,对数组进行线性回归,并根据梯度在Python中写入csv

c++ - 删除动态分配的二维数组时发生错误?

使用指针从一个数组复制到另一个数组

c - 坚持使用 c 中的语法 - 指针

c - printf 在行尾插入 %

C++模板指向成员

c - arm cortex m4上的总线错误调试