我是C语言的初学者,这是我第一个使用malloc()函数的程序。我认为使用这个函数可能会有一些问题。我想使用一个数组(cyclelength),其中将放置一系列数字(用户输入)的解决方案。所以数组大小取决于用户所以我使用了malloc()。但程序崩溃了。这是我的代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x,y,num,count,p,k;
for(;;){
printf("enter first integer. must be between 1 and 100000\n");
scanf("%d", &x);
printf("enter second integer. must be between 1 and 100000. must not equal the first integer.\n");
scanf("%d", &y);
if(x>=1 && x<100000 && y>=1 && y<100000 && x!=y){
break;
}
else{
printf("try the whole process again\n");
}
}
if (x<y){
int j;
j=y;
y=x;
x=j;
} //making x always greater than y
int *cyclelength=malloc(5000*sizeof(int));
if (NULL==cyclelength){
printf("process aborted");
}
else{
/*solution part for the range of number. and solution for each number put into cyclelength.*/
num=y;
while(num<=x){
p=1;
k=num;
while(k!=1){
if(k%2==0)
k=k/2;
else
k=3*k+1;
p+=1;
}
count=0;
cyclelength[count]=p;
num+=1;
count+=1;
}
free(cyclelength);
cyclelength=NULL;
}
int c=0;
int max=cyclelength[c];
for(;c<x-y;c+=1){
if(max<cyclelength[c+1]){
max=cyclelength[c+1];
}
}
printf("%d,%d,%d",x,y,max);
return 0;
}
答案 0 :(得分:4)
您正在调用free(cyclelength)
和然后访问它指向的内存(或者更确切地说,它指向的内存)。
(您的错误处理可能会有所改善;您打印"process aborted"
,然后继续处理。)
答案 1 :(得分:4)
您在cyclelength
之后使用free
并将其设置为NULL
:
free(cyclelength);
cyclelength=NULL;
}
int c=0;
int max=cyclelength[c];
for(;c<x-y;c+=1){
if(max<cyclelength[c+1]){
max=cyclelength[c+1];
}
这是未定义的行为,可能会崩溃。
答案 2 :(得分:0)
你正在使用cyclelength,因此你的程序崩溃了 试试这个:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int x,y,num,count,p,k;
for(;;){
printf("enter first integer. must be between 1 and 100000\n");
scanf("%d", &x);
printf("enter second integer. must be between 1 and 100000. must not equal the first integer.\n");
scanf("%d", &y);
if(x>=1 && x<100000 && y>=1 && y<100000 && x!=y){
break;
}
else{
printf("try the whole process again\n");
}
}
if (x<y){
int j;
j=y;
y=x;
x=j;
} //making x always greater than y
int *cyclelength=(int *)malloc(5000*sizeof(int));
if (NULL==cyclelength){
printf("process aborted");
}
else{
/*solution part for the range of number. and solution for each number put into cyclelength.*/
num=y;
while(num<=x){
p=1;
k=num;
while(k!=1){
if(k%2==0)
k=k/2;
else
k=3*k+1;
p+=1;
}
count=0;
cyclelength[count]=p;
num+=1;
count+=1;
}
// don't assign null to cyclelength
//cyclelength=NULL;
}
int c=0;
int max=cyclelength[c];
for(;c<x-y;c+=1){
if(max<cyclelength[c+1]){
max=cyclelength[c+1];
}
}
printf("%d,%d,%d",x,y,max);
// free here
free(cyclelength);
return 0;
}