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
相关产品推荐
相关产品推荐

