#include<stdio.h>
#include<stdlib.h>
int main(void){
int *L;
int l,m;
scanf("%d %d",&l,&m);
L=(int *)malloc(sizeof(int)*l);
int i,j;
for(i=0;i<l;i++){
L[i]=1;
}
int **M;
M=(int **)malloc(sizeof(int *)*m);
for(i=0;i<m;i++){
if((*M=(int *)malloc(sizeof(int)*2))!=NULL){
printf("YES\n");
}
}
for(i=0;i<m;i++){
scanf("%d %d",&M[i][0],&M[i][1]); //在输入数据时出了问题
}
for(i=0;i<m;i++){
for(j=M[i][0];j<=M[i][1];j++){
L[j]=0;
}
}
int sum=0;
for(i=0;i<l;i++){
if(L[i]) sum++;
}
printf("%d",sum);
for(i=0;i<m;i++){
free(M[i]);
}
free(M);
return 0;
}
看代码 我人都要整疯了 我在其他地方用过这种定义的
但到这里 在我注释的那个地方输入就出了问题 为什么为什么为什么为什么为什么为什么为什么为什么
代码做的题目是“校门外的树” 要移树的就是了
生成M,L行,m列方法如上,思路就是,先生成L个空间,储存每行的首地址,然后利用循环,每行再生成m个空间,因为M[i]储存的是首地址,所以看成整体指针p,因为索引单个指针p的方式是p[j],所以索引二维数组是M[i][j],输入时出现问题的原因是,每次接受的是第i行的第一个和第二个数,也就是默认列数是2,题主可以尝试,输入行列数时,列数,始终为2,这是不会出错的。
int **M;
M=(int **)malloc(sizeof(int *)*l);
for(i=0;i<m;i++){
M[i]=(int *)malloc(sizeof(int)*m);
}
if((*M=(int *)malloc(sizeof(int)*2))!=NULL){
printf("YES\n");
}
申请空间时错误,*M=(int *)malloc(sizeof(int)*2),只是给数组的第一行反复申请空间,跟其他行没有关系,将*M改成M[i]应该就可以了
#include<stdio.h>
#include<stdlib.h>
int main(void){
int *L;
int l,m;
scanf("%d %d",&l,&m);
L=(int *)malloc(sizeof(int)*l);
int i,j;
for(i=0;i<l;i++){
L[i]=1;
}
int **M;
M=(int **)malloc(sizeof(int *)*m);
for(i=0;i<m;i++){
if((M[i]=(int *)malloc(sizeof(int)*2))!=NULL){
printf("YES\n");
}
}
for(i=0;i<m;i++){
scanf("%d %d",&M[i][0],&M[i][1]); //在输入数据时出了问题
}
for(i=0;i<m;i++){
for(j=M[i][0];j<=M[i][1];j++){
L[j]=0;
}
}
int sum=0;
for(i=0;i<l;i++){
if(L[i]) sum++;
}
printf("%d",sum);
for(i=0;i<m;i++){
free(M[i]);
}
free(M);
return 0;
}
不是 *M 而是 M[i]
是否输入数字时不是按的空格,scanf的用法必须一致
*M那里有问题仔细看一下