我想填充并打印一个静态矩阵,然后使用 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));
一切正常,但我必须使用静态分配。
最佳答案
因为A[i][j]
的地址根据定义 &A[0][0] + i * cols + j
其中 cols
是声明的矩阵列数。
因此,如果您在 main 中将矩阵声明为 int A[4][4]
,则您只为 16 个 int 保留内存。但是,当您在函数中将其用作 int A[32][32]
时,A[3][0]
的地址是 A[0 之后的 60 个位置][0]
远远超出了分配的数组 => 您只需调用未定义的行为
您必须在 main 中将矩阵声明为 int A[MAX][MAX];
,然后只要声明了该矩阵<,您就可以安全地仅使用第一行和第一列 主要功能和所有功能具有相同的尺寸。
可变长度数组也可以是一个不错的选择(感谢 Jonathan Leffler 的建议)。它们在 C99 中受支持,并且自 C11 起也有选择地受支持,但所有最近的主要 C 编译器都接受它,即使 MSVC 支持相当新。
这意味着您仍然可以在 main 中声明 int A[row][col];
,但您的函数声明必须变为:
void fill( int numRig, int numCol, int A[numRig][numCol]){
...
}
void stamp(int numRig, int numCol, int A[numRig][numCol]){
...
}
可变长度数组应在函数声明中在其维度之后声明。
但是现在由于矩阵的声明维度在整个程序中是一致的,因此不涉及未定义的行为......
<小时/>无论如何,根据标准,简单地将矩阵或简单数组别名为不同大小的矩阵或数组是未定义的行为。
关于c - 在 C 中打印并插入静态矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43141643/