(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/