You need to enable JavaScript to run this app. C语言通过指针向函数传递整个一维数组并录入元素问题求解
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 18:06:03