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

C语言:写入结构体指针时持续触发段错误,求排查方案

段错误原因分析及修复方案

你的代码触发段错误主要有两个核心问题:

1. 野指针访问

全局指针numberStruct_p未初始化,属于野指针(指向未知的非法内存地址)。在main函数里直接将它传给inputNumbers函数后,通过该指针访问结构体成员时,本质是在读写非法内存,直接触发段错误。

你已经定义了全局结构体实例numberStruct,只需让指针指向它,或者直接传递该实例的地址给函数即可。

2. scanf参数传递错误

scanf要求传入变量的地址来完成赋值,但你现在传的是结构体成员的值。比如scanf("%d %d", numberStruct_p->intOne, numberStruct_p->intTwo)中,numberStruct_p->intOne是成员的具体数值,而非地址,这会导致scanf把输入值写入错误的内存位置,引发段错误或其他未定义行为。正确写法是给成员加上取地址符&。


修复后的完整代码

#include <stdio.h>

struct numberStructure {
    int intOne;
    int intTwo;
    float floatOne;
    float floatTwo;
} numberStruct; // 无需全局指针,直接用实例即可

void inputNumbers(struct numberStructure *);
void outputNumbers(void);

int main(void) {
    inputNumbers(&numberStruct); // 传递全局实例的地址
    outputNumbers();
    return 0;
}

void inputNumbers(struct numberStructure *numberStruct_p) {
    printf("\n-----WELCOME TO THE PROGRAM-----\n");
    printf("-----ENTER IN TWO INTEGERS (Space separated)-----\n: ");
    scanf("%d %d", &numberStruct_p->intOne, &numberStruct_p->intTwo); // 加&取成员地址
    printf("-----ENTER IN TWO FLOATS (Space separated)-----\n: ");
    scanf("%f %f", &numberStruct_p->floatOne, &numberStruct_p->floatTwo); // 加&取成员地址
}

void outputNumbers(void) {
    printf("\n%d %d", (numberStruct.intOne + numberStruct.intTwo), (numberStruct.intOne - numberStruct.intTwo));
    printf("\n%.1f %.1f", (numberStruct.floatOne + numberStruct.floatTwo), (numberStruct.floatOne - numberStruct.floatTwo));
}

额外优化建议

如果不想依赖全局变量,可在main中定义局部结构体实例,再传递地址,提升代码模块化程度:

int main(void) {
    struct numberStructure numStruct; // 局部实例
    inputNumbers(&numStruct);
    outputNumbers(&numStruct); // 修改outputNumbers让它接收指针参数
    return 0;
}

// 同步修改outputNumbers函数
void outputNumbers(struct numberStructure *numStruct) {
    printf("\n%d %d", (numStruct->intOne + numStruct->intTwo), (numStruct->intOne - numStruct->intTwo));
    printf("\n%.1f %.1f", (numStruct->floatOne + numStruct->floatTwo), (numStruct->floatOne - numStruct->floatTwo));
}

内容的提问来源于stack exchange,提问作者Tekkerito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:01:05