我正在学习如何在C中操纵2D数组,我必须将左移应用于矩阵,因此A [0] [0]成为A [0] [1]等处的值。这是几次尝试后得到的代码和输出;我想我可能会越来越近了:
void LeftShift2D(int A[M][N]){
int i;
int j;
int temp;
for(i = 0; i < M; i++){
for(j = 0; j < N; j++){
temp = A[0][0];
A[i][j] = A[i+1][j+1];
}
}
A[i][j] = temp;
}
将此作为输入:
14 17 28 26 24
26 17 13 10 2
3 8 21 20 24
17 1 7 23 17
12 9 28 10 3
21 3 14 8 26
这是所需的输出:
17 28 26 24 26
17 13 10 2 3
8 21 20 24 17
1 7 23 17 12
9 28 10 3 21
3 14 8 26 14
但这是我得到的实际输出:
14 17 28 26 24
26 17 13 10 2
3 8 21 20 24
17 1 7 23 17
12 9 28 10 3
21 3 14 8 26
4
17 13 10 2 3
8 21 20 24 17
1 7 23 17 12
9 28 10 3 21
3 14 8 26 4
-1218716075 -1217196044 0 -1079502888 134514340
怎么了?
答案 0 :(得分:3)
到目前为止,最简单的方法是做你想要的:
void LeftShift2D(int A[M][N])
{
int i;
int temp = A[0][0];
int *base = &A[0][0];
for (i = 0; i < M * N - 1; i++)
base[i] = base[i+1];
A[i] = temp;
}
这会将数组视为向量,并将数据向下移动一个空格,将最初在开始时的值旋转到结尾。如果您想分别旋转每一行,您将使用不同的代码,与您显示的内容更为相关:
void LeftShift2D(int A[M][N])
{
int temp;
for (int i = 0; i < M; i++)
{
int j;
int temp = A[i][0]
for (j = 0; j < N - 1; j++)
A[i][j] = A[i][j+1];
A[i][j] = temp;
}
}
您的代码存在各种问题。 A[i][j] = A[i+1][j+1];
赋值访问数据超出范围,并“对角”复制数据,将单元格复制到当前单元格的右下角(或东南角),而不是右侧(东侧)的单元格。当前的细胞。它的包装也有问题。
答案 1 :(得分:1)
这里有缓冲区溢出
A[i][j] = A[i+1][j+1];
您需要迭代到i < M - 1
和j < N - 1
。
您正在访问无效内存,该内存解释了观察到的值,这也会调用未定义的行为,因此您最终可能会发现一些奇怪的行为。