我想填充并打印一个静态矩阵,然后使用Young Tablue属性Here进行排序,但我有一些维度(行和列)输入的问题,有些输入显示我正确的矩阵,但与其他人给我seg.fault或奇怪的输出。 这里的功能是:
#include <stdio.h>
#include <stdlib.h>
#define MAX 32
void fill( int A[MAX][MAX], int numRig, int numCol, int numElem){
int i,j;
int count = 0;
for ( i = 0 ; i < numRig; i++ ) {
for ( j = 0 ; j < numCol; j++) {
A[i][j] = rand() % 20;
//fscanf(stdin,"%d", &A[i][j]);
//DEBUG
printf("%d\n", A[i][j]);
}
}
}
void stamp(int A[MAX][MAX], int numRig, int numCol){
int k,h;
for ( h = 0 ; h < numRig; h++ ) {
for ( k = 0 ; k < numCol; k++) {
printf("%d ", A[h][k]);
}
printf("\n");
}
}
主要
int main () {
int row,col;
printf("Insert row and col:\n");
scanf("%d %d", &row, &col);
int A[row][col];
fill(A,row,col);
stamp(A,row,col);
return 0;
}
输出row = 4和col = 4: “3 6 17 15 -1 0 0 0 2017675728 32765 -741456064 21906 -1 0 0 0 2017675728 32765 -741456064 21906 0 0 -741454033 21906 2017675728 32765 -741456064 21906 0 0 -741454033 21906 4 0 0 0 0 0 -741454033 21906 4 0 0 0 2017675976 32765 2017675552 32765 4 0 0 0 2017675976 32765 2017675552 32765 3 0 0 0 2017675976 32765 2017675552 32765 3 0 0 0 4 0 0 0 “
我尝试了动态分配:
a=(int**)malloc(row*(sizeof(int*)));
for(i=0;i<row;i++)
a[i]=(int*)malloc(col*sizeof(int));
并且一切正常,但我必须使用静态分配。
答案 0 :(得分:1)
因为A[i][j]
的地址定义为 &A[0][0] + i * cols + j
,其中cols
是矩阵的声明列数。
因此,如果您在main中将矩阵声明为int A[4][4]
,则只保留16个整数的内存。但是,当您在int A[32][32]
的函数地址A[3][0]
中使用A[0][0]
时,int A[MAX][MAX];
之后的地方距离int A[row][col];
已超过分配的数组=&gt;你只是调用未定义的行为
您必须将main中的矩阵声明为void fill( int numRig, int numCol, int A[numRig][numCol]){
...
}
void stamp(int numRig, int numCol, int A[numRig][numCol]){
...
}
,然后您可以安全地仅使用第一行和第一列,只要矩阵声明,并且在main中具有相同的维度功能
可变长度阵列在这里也是一个不错的选择(感谢Jonathan Leffler提出的建议)。它们在C99中受支持,并且从C11开始可选地受支持,但所有主要的C编译器都接受它,即使MSVC支持是最新的。
这意味着您仍然可以在main中声明id
,但您的函数声明必须变为:
''
变量长度数组应在函数声明中的维度后声明为。
但是现在由于矩阵的声明维度在整个程序中是一致的,所以不涉及未定义的行为......
无论如何,根据标准,简单地将矩阵或简单数组混叠到不同大小的矩阵或数组是未定义的行为。