c语言不定常度二维数组

#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那里有问题仔细看一下