user-0 提问: 《新手纠结向》有关二维数组 麻烦各位看看我这段代码

回复:
user: user-0
content: 引用 8 楼 天翔龙闪 的回复:那应该可以运行上面我的代码，如果觉得麻烦，你就按照这种方式定义定长数组就可以了 #include<stdio.h> #define  N 100 int main() { 	int a[N][N]; 	return 0; }  谢谢兄弟 我知道问题出在哪里了 我定义数组的方法确实不对 我感觉正确的方法应该是你 那样的 现在我知道了为什么数组的题都要给我数组元素的个数限制的 我把前面的数组都修改为x[10][10]（因为题中要求最多是10行10列）后 程序就完美运行了 不会出现倒置或者减行的情况   同时谢谢围观的各位帮忙顶热度

user: user-1
content: 那应该可以运行上面我的代码，如果觉得麻烦，你就按照这种方式定义定长数组就可以了 #include<stdio.h> #define  N 100 int main() { 	int a[N][N]; 	return 0; }

user: user-0
content: 引用 4 楼 天翔龙闪 的回复:如果你要定长的数组的话，就不要用 i j，而是用将数组设定为定长，一般做法是这样 在头文件下方宏定义define你需要的数组大小，然后写成定长的数组就可以了  #define  N 100 int a[N][N];  我还真没这么做过 一直是用scanf定义的  我们还没学宏的应用

user: user-0
content: 楼主使用的编译软件是CODEBLOCK16.01

user: user-0
content: 引用 3 楼 天翔龙闪 的回复:哦哦，还有我是在vs里面帮你测试的，你用代码的时候，将scanf_s改成scanf吧，否则有可能编译不通过  好的 谢谢

user: user-1
content: 如果你要定长的数组的话，就不要用 i j，而是用将数组设定为定长，一般做法是这样 在头文件下方宏定义define你需要的数组大小，然后写成定长的数组就可以了  #define  N 100 int a[N][N];

user: user-1
content: 哦哦，还有我是在vs里面帮你测试的，你用代码的时候，将scanf_s改成scanf吧，否则有可能编译不通过

user: user-0
content: 引用 1 楼 天翔龙闪 的回复:楼主你是想要不定长数组吧，如果想要不定长数组，在c里面，只有在堆区malloc出来数组，  一维数组的malloc方法如下 	//在堆区初始化一维数组 	float* r = (float*)malloc(i*sizeof(float));  二维数组的malloc方法如下 	//在堆区初始化二维数组 	float** x = (float**)malloc(i * sizeof(float*));//分配行的内存 	int k; 	for (k= 0; k < i; ++k) {//分配列的内存 		x[k] = (float*)malloc(j * sizeof(float)); 	}  完整代码如下  #include<stdio.h> #include<malloc.h>//如果你的编译器不通过，则换成<stdlib.h>  int main() { 	int i, j, t, a, b; 	scanf_s("%d %d", &i, &j);  	//在堆区初始化一维数组 	float* r = (float*)malloc(i*sizeof(float));  	//在堆区初始化二维数组 	float** x = (float**)malloc(i * sizeof(float*));//分配行的内存 	int k; 	for (k= 0; k < i; ++k) {//分配列的内存 		x[k] = (float*)malloc(j * sizeof(float)); 	}  	//在堆区初始化二维数组 	float** n = (float**)malloc(i * sizeof(float*)); 	for (k= 0; k < i; ++k) { 		n[k] = (float*)malloc(j * sizeof(float)); 	}  	for (a = 0; a < i; a++) 	{ 		for (b = 0; b < j; b++) 		{ 			scanf_s("%f", &x[a][b]); 			n[a][b] = x[a][b]; 		} 	} 	for (a = 0; a < i; a++)//此处的for循环嵌套是为了挑出数组中的最大值  	{ 		t = 1; 		for (b = 0; b < j; b++) 		{  			if (t <= j - 1) 			{ 				if (x[a][0] >= x[a][t]) 				{ 					t += 1; 				} 				else 				{ 					x[a][0] = x[a][t]; 					t += 1; 				} 			} 			else 				break;  		} 		r[a] = x[a][0];//将i个最大值放入数组中r 	} 	printf("\n"); 	printf("%.2f %.2f \n", n[0][0], n[1][0]); 	printf("\n");  	//删除在堆区开辟的数组 	free(r); 	r = NULL;//置空  	//删除在堆区开辟的二维数组 	for (k = 0; k < i; k++) { 		free(x[k]); 		x[k] = NULL;  		free(n[k]); 		n[k] = NULL; 	}  	free(x); 	x = NULL;  	free(n); 	n = NULL;   	return 0; }  像这种不定长的数组，都需要在堆区做才行。并且用完之后，要手动释放其中的内存，当然，如果用c++的话，就简单多了  兄弟  谢谢你的解答 我还没学那么深 指针都还没有接触  我就是很疑惑我这个代码 为什么会平白无故出现这个问题？我的是比较基本的定长的二维数组  这个就是我写作业程序的一小段代码

user: user-1
content: 楼主你是想要不定长数组吧，如果想要不定长数组，在c里面，只有在堆区malloc出来数组，  一维数组的malloc方法如下 	//在堆区初始化一维数组 	float* r = (float*)malloc(i*sizeof(float));  二维数组的malloc方法如下 	//在堆区初始化二维数组 	float** x = (float**)malloc(i * sizeof(float*));//分配行的内存 	int k; 	for (k= 0; k < i; ++k) {//分配列的内存 		x[k] = (float*)malloc(j * sizeof(float)); 	}  完整代码如下  #include<stdio.h> #include<malloc.h>//如果你的编译器不通过，则换成<stdlib.h>  int main() { 	int i, j, t, a, b; 	scanf_s("%d %d", &i, &j);  	//在堆区初始化一维数组 	float* r = (float*)malloc(i*sizeof(float));  	//在堆区初始化二维数组 	float** x = (float**)malloc(i * sizeof(float*));//分配行的内存 	int k; 	for (k= 0; k < i; ++k) {//分配列的内存 		x[k] = (float*)malloc(j * sizeof(float)); 	}  	//在堆区初始化二维数组 	float** n = (float**)malloc(i * sizeof(float*)); 	for (k= 0; k < i; ++k) { 		n[k] = (float*)malloc(j * sizeof(float)); 	}  	for (a = 0; a < i; a++) 	{ 		for (b = 0; b < j; b++) 		{ 			scanf_s("%f", &x[a][b]); 			n[a][b] = x[a][b]; 		} 	} 	for (a = 0; a < i; a++)//此处的for循环嵌套是为了挑出数组中的最大值  	{ 		t = 1; 		for (b = 0; b < j; b++) 		{  			if (t <= j - 1) 			{ 				if (x[a][0] >= x[a][t]) 				{ 					t += 1; 				} 				else 				{ 					x[a][0] = x[a][t]; 					t += 1; 				} 			} 			else 				break;  		} 		r[a] = x[a][0];//将i个最大值放入数组中r 	} 	printf("\n"); 	printf("%.2f %.2f \n", n[0][0], n[1][0]); 	printf("\n");  	//删除在堆区开辟的数组 	free(r); 	r = NULL;//置空  	//删除在堆区开辟的二维数组 	for (k = 0; k < i; k++) { 		free(x[k]); 		x[k] = NULL;  		free(n[k]); 		n[k] = NULL; 	}  	free(x); 	x = NULL;  	free(n); 	n = NULL;   	return 0; }  像这种不定长的数组，都需要在堆区做才行。并且用完之后，要手动释放其中的内存，当然，如果用c++的话，就简单多了