You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言指向结构体数组的指针输入值时崩溃原因及实现方案

问题原因分析
  • 根本原因是scanf函数的传参错误:对于%d、%f这类格式符,要求传入对应变量的内存地址,而你的代码直接传入了变量本身的值。
  • 输入name未报错的原因:推测struct bankacc中的name是字符数组成员(如char name[64];),数组名本身就代表首元素地址,刚好符合%s要求传入字符串缓冲区地址的规则,因此运行正常。
  • 输入accno未报错仅为巧合:accno是int类型,直接传ptr->accno相当于把该成员的未初始化随机值当作地址传给scanf,如果这个随机值刚好对应进程可写的内存地址,就不会立刻触发段错误,属于未定义行为的表现之一。
  • 输入balance触发崩溃的原因:balance是float类型,其未初始化的随机值刚好指向了进程无写入权限的内存地址,scanf尝试写入时触发了段错误。
正确实现方案

修正后代码如下,仅需要给非字符串类型的参数加上取地址符&即可:

void input(struct bankacc b[], int n){
    struct bankacc *ptr = NULL;
    ptr = b;
    for(; ptr < (b + n); ptr += 1)
    {
        printf("Enter name: ");
        // 建议加长度限制避免缓冲区溢出,例如name长度为32时写%31s
        scanf("%s", ptr->name);
        printf("Enter account number: ");
        // 增加取地址符&
        scanf("%d", &ptr->accno);
        printf("Enter balance: ");
        // 增加取地址符&
        scanf("%f", &ptr->balance);
        printf("_____ \n");        
    }
}

内容的提问来源于stack exchange,提问作者Saksh-BuiltABot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:06:10