C语言通过指针向函数传递整个一维数组并录入元素问题求解
问题根因
你代码的核心问题是指针类型不匹配:
- 你在
main中定义的a是变长数组,&a的类型是int (*)[n](指向长度为n的int数组的指针) - 但
init函数的形参p声明的是int **(指向int指针的指针),二者类型完全不兼容,这就是编译警告的触发原因。
为什么程序仍可正常运行
这属于典型的「未定义行为碰巧生效」:
数组首地址a的值和数组的地址&a的值在内存布局上是完全相同的,虽然你把&a错误赋值给了int**类型的p,但对p做一次解引用*p得到的值刚好等于数组首元素的地址,*p + i计算出来的刚好是数组第i个元素的地址,因此scanf写入的内存位置是正确的,程序看起来能正常运行,但这种写法完全不符合C标准,换编译环境或者调整代码结构极大概率会崩溃。
修复方案
推荐采用最通用的数组传参写法,不需要用到二级指针:
#include <stdio.h> #include <stdlib.h> // 形参直接接收数组退化后的首元素指针 void init(int *p, int n) { printf("Enter the array elements:\n"); for (int i = 0; i < n; i++) scanf("%d", p + i); } int main() { int n; printf("enter the size of array\n"); scanf("%d", &n); int a[n]; // 直接传数组名即可,数组会自动退化为首元素指针 init(a, n); // 后续可加代码验证数组录入结果 return 0; }
如果你确实需要传递指向数组的指针(仅做语法演示,该场景下没必要这么写),可以按如下方式修改,不会触发警告:
#include <stdio.h> #include <stdlib.h> // 变长数组长度参数要放在数组指针参数之前 void init(int n, int (*p)[n]) { printf("Enter the array elements:\n"); for (int i = 0; i < n; i++) scanf("%d", &(*p)[i]); } int main() { int n; printf("enter the size of array\n"); scanf("%d", &n); int a[n]; init(n, &a); return 0; }
内容的提问来源于stack exchange,提问作者Kumar Aryan
相关产品推荐
相关产品推荐

