.......
ds *get_input()
{
int n = 0;
int flag = 0;
char p1,q1;
ds *a;
a = (ds *)malloc(sizeof(a));
do
{
p1 = getchar();
fflush(stdin);
if((p1=='X')||(p1=='x'))
{
flag = 1;
break;
}
q1 = getchar();
fflush(stdin);
if((q1=='X')||(q1=='x'))
{
flag = 1;
break;
}
a[n].p = atoi(&p1);
a[n].q = atoi(&q1);
n++;
} while(flag == 0);
return a;
};
.......
其中a为指向结构数组的指针,定义如下:
struct
{
int p;
int q
} *a;
本人想让每次输入的数分别放入一个结构数组中的p,q里去,但问题出在:在程序运行时,当输入到第15个数的时候,程序就报错,错误代码:
QUICK 在 017f:004012c5 的模块
QUICK.EXE 中导致无效页错误。
Registers:
EAX=00000000 CS=017f EIP=004012c5 EFLGS=00010216
EBX=00550000 SS=0187 ESP=0065fd30 EBP=0065fd9c
ECX=00000e28 DS=0187 ESI=8183e554 FS=3607
EDX=00780ec0 ES=0187 EDI=0065fd9c GS=0000
Bytes at CS:EIP:
89 04 ca 8d 45 ec 50 e8 6f 02 00 00 83 c4 04 8b
Stack dump:
0065fdf8 8183e554 00550000 cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc cccccccc
程序调试时,在输入到第15个数的时候,getchar()函数就不执行了,不知是为何,只好请教各位前辈了。
5 个解决方案
#1
把a = (ds *)malloc(sizeof(a))改成:
a = (ds *)malloc(sizeof(a)*20);
你分配的空间不够多。上面的语句是分配可以存储20个节点的空间。
a = (ds *)malloc(sizeof(a)*20);
你分配的空间不够多。上面的语句是分配可以存储20个节点的空间。
#2
a = (ds *) malloc(sizeof(*a) * 20);
^^^
应该是这样才对
你分配的空间太少,造成的错误
^^^
应该是这样才对
你分配的空间太少,造成的错误
#3
a = (ds *) malloc(sizeof(ds) * 20);
你的代码很不归整,可能搞死程序的地方太多,内存未释放,大忌。
就算你在其他函数释放,该函数也就毫无独立性。
建议:在调用函数前申请a的内存,同时将a的边界作为参数输入。
a完全可以用数组实现,如果a的数量不大(例如1000以下),不需要在堆上分配内存。
int get_input(ds* a, int num)
{
int n = 0;
char p1,q1;
if(a==NULL)
return -1;
memset(a, 0, sizeof(ds)*num);
while(n<num)
{
p1 = getchar();
fflush(stdin);
if((p1=='X')||(p1=='x'))
break;
if(isdigit(p1))
a[n].p = p1-0x30;
q1 = getchar();
fflush(stdin);
if((q1=='X')||(q1=='x'))
break;
if(isdigit(q1))
a[n].q = q1-0x30;
n++;
};
return 0;
};
你的代码很不归整,可能搞死程序的地方太多,内存未释放,大忌。
就算你在其他函数释放,该函数也就毫无独立性。
建议:在调用函数前申请a的内存,同时将a的边界作为参数输入。
a完全可以用数组实现,如果a的数量不大(例如1000以下),不需要在堆上分配内存。
int get_input(ds* a, int num)
{
int n = 0;
char p1,q1;
if(a==NULL)
return -1;
memset(a, 0, sizeof(ds)*num);
while(n<num)
{
p1 = getchar();
fflush(stdin);
if((p1=='X')||(p1=='x'))
break;
if(isdigit(p1))
a[n].p = p1-0x30;
q1 = getchar();
fflush(stdin);
if((q1=='X')||(q1=='x'))
break;
if(isdigit(q1))
a[n].q = q1-0x30;
n++;
};
return 0;
};
#4
感谢网友xuying(),Maxwell(不可知)和ryan_chen(陈磊)的友情帮助,已加分!
#5
感谢网友xuying(),Maxwell(不可知)和ryan_chen(陈磊)的友情帮助,已加分!
#1
把a = (ds *)malloc(sizeof(a))改成:
a = (ds *)malloc(sizeof(a)*20);
你分配的空间不够多。上面的语句是分配可以存储20个节点的空间。
a = (ds *)malloc(sizeof(a)*20);
你分配的空间不够多。上面的语句是分配可以存储20个节点的空间。
#2
a = (ds *) malloc(sizeof(*a) * 20);
^^^
应该是这样才对
你分配的空间太少,造成的错误
^^^
应该是这样才对
你分配的空间太少,造成的错误
#3
a = (ds *) malloc(sizeof(ds) * 20);
你的代码很不归整,可能搞死程序的地方太多,内存未释放,大忌。
就算你在其他函数释放,该函数也就毫无独立性。
建议:在调用函数前申请a的内存,同时将a的边界作为参数输入。
a完全可以用数组实现,如果a的数量不大(例如1000以下),不需要在堆上分配内存。
int get_input(ds* a, int num)
{
int n = 0;
char p1,q1;
if(a==NULL)
return -1;
memset(a, 0, sizeof(ds)*num);
while(n<num)
{
p1 = getchar();
fflush(stdin);
if((p1=='X')||(p1=='x'))
break;
if(isdigit(p1))
a[n].p = p1-0x30;
q1 = getchar();
fflush(stdin);
if((q1=='X')||(q1=='x'))
break;
if(isdigit(q1))
a[n].q = q1-0x30;
n++;
};
return 0;
};
你的代码很不归整,可能搞死程序的地方太多,内存未释放,大忌。
就算你在其他函数释放,该函数也就毫无独立性。
建议:在调用函数前申请a的内存,同时将a的边界作为参数输入。
a完全可以用数组实现,如果a的数量不大(例如1000以下),不需要在堆上分配内存。
int get_input(ds* a, int num)
{
int n = 0;
char p1,q1;
if(a==NULL)
return -1;
memset(a, 0, sizeof(ds)*num);
while(n<num)
{
p1 = getchar();
fflush(stdin);
if((p1=='X')||(p1=='x'))
break;
if(isdigit(p1))
a[n].p = p1-0x30;
q1 = getchar();
fflush(stdin);
if((q1=='X')||(q1=='x'))
break;
if(isdigit(q1))
a[n].q = q1-0x30;
n++;
};
return 0;
};
#4
感谢网友xuying(),Maxwell(不可知)和ryan_chen(陈磊)的友情帮助,已加分!
#5
感谢网友xuying(),Maxwell(不可知)和ryan_chen(陈磊)的友情帮助,已加分!