【发布时间】:2015-06-12 16:23:55
【问题描述】:
我已经把头撞在墙上一个小时了,我正在失去理智...我有一段代码(是的,这是家庭作业)会引发分段错误,除非我注释掉其中一个我的 scanf 语句。我尝试使用 gdb 来调试问题,但直到今天我还没有真正了解这一点。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * creditCard(char * ccNumber){
char * lastFour;
lastFour = (ccNumber + strlen(ccNumber) - 4);
return lastFour;
}
void zipCode(int zip){
printf("The zip code entered is: %d\n", zip);
}
int fuelGrade(int grade){
}
int main(void){
char * ccNumber = NULL;
int zip = 0;
int gasGrade = 0;
printf("Please Enter Credit Card Number: ");
scanf("%s", ccNumber);
printf("Please Enter Your Billing Zip Code: ");
scanf("%d", &zip);
printf("Select your Fuel Grade.\n Unleaded(1) Plus(2) Premium(3): ");
scanf("%d", &gasGrade);
ccNumber = creditCard(ccNumber);
printf("****-****-****-%s\n", ccNumber);
zipCode(zip);
return 0;
}
当我按原样编译和运行时,我得到以下信息:
Please Enter Credit Card Number: 123413515
Please Enter Your Billing Zip Code: Select your Fuel Grade.
Unleaded(1) Plus(2) Premium(3): 1
Segmentation fault
输入邮政编码被跳过,我在输入任何燃料等级后立即得到一个段错误。但是,如果我注释掉 scanf("%d", &gasGrade); 行,代码运行良好。
最初我没有初始化变量,并且我的代码组织方式略有不同,但我似乎无法找到解决这个问题的正确方法。 我在这里做错了什么?
感谢您的帮助!
【问题讨论】:
-
ccnumber 变量需要指向分配的内存区域(比信用卡号的最大长度长)建议,在声明 ccnumber 的地方,追加:= malloc(MAX_CC_NUM_LEN) 或类似的东西.请记住始终检查 (!=NULL) 从 malloc()(和函数系列)返回的值,以确保操作成功。
标签: c segmentation-fault scanf