C 矩阵旋转..for循环更改指针的值
在数组的最终值中,只有第一个元素变为零,当它再次进入for循环时(使用gdb检查)…我在代码底部提到了使用注释的问题。请帮我解决。。我不知道出了什么问题C 矩阵旋转..for循环更改指针的值,c,C,在数组的最终值中,只有第一个元素变为零,当它再次进入for循环时(使用gdb检查)…我在代码底部提到了使用注释的问题。请帮我解决。。我不知道出了什么问题 #include<stdio.h> #include<stdlib.h> int main() { int a, b, c; printf("enter the size of matrix"); scanf("%d%d",&a,&
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a, b, c;
printf("enter the size of matrix");
scanf("%d%d",&a,&b);
printf("enter the number of rotations");
scanf("%d",&c);
int *arr = malloc (sizeof(int) * a * b);
int x = (a >= b)? a : b;
printf("enter the values of matrix");
// scanning the values
for(int i = 0; i < a; i++)
{
for(int j = 0; j < b; j++)
{
scanf("%d",(arr + i * b + j));
}
printf("\n");
}
// main code starts
for(int y = 0; y < c; y++)
{
// declared a new array
int *arr1 = malloc (sizeof(int) * a * b);
for(int k = 0; k < x / 2; k++)
{
for(int i = k; i < a - k; i++)
{
for(int j = k; j < b - k; j++)
{
if (i == k && j > k)
{
*(arr1 + i * b + j - 1) = *(arr + i * b + j);
}
else if (i == a - k - 1 && j < b - k - 1)
{
*(arr1 + i * b + j + 1) = *(arr + i * b + j);
}
else if (j == k && i < a - k - 1)
{
*(arr1 + i * b + j + b) = *(arr + i * b + j);
}
else if (j == b - k - 1 && i > k)
{
*(arr1 + i * b + j - b) = *(arr + i * b + j);
}
}
}
if (x % 2 != 0 && a == b)
*(arr1 + x / 2 * b + (b / 2)) = *(arr + x / 2 * b + (b / 2));
}
// changing the old array to new array
arr = arr1;
// first value is getting printed correctly here
printf("%d\n",*(arr));
printf("%p\n",&(*arr));
free(arr1);
}
// printing the output
for(int i = 0; i < a; i++)
{
for(int j = 0; j < b; j++)
{
printf("%d ",*(arr + i * b + j));
}
printf("\n");
}
// first value is getting printed incorrectly here, outside the loop
printf("\n%d\n",*(arr));
printf("%p",&(*arr));
}
#包括
#包括
int main()
{
INTA、b、c;
printf(“输入矩阵的大小”);
scanf(“%d%d”、&a和&b);
printf(“输入旋转次数”);
scanf(“%d”、&c);
int*arr=malloc(sizeof(int)*a*b);
INTX=(a>=b)?a:b;
printf(“输入矩阵值”);
//扫描值
for(int i=0;ik)
{
*(arr1+i*b+j-1)=*(arr+i*b+j);
}
else如果(i==a-k-1&&jk)
{
*(arr1+i*b+j-b)=*(arr+i*b+j);
}
}
}
如果(x%2!=0&&a==b)
*(arr1+x/2*b+(b/2))=*(arr+x/2*b+(b/2));
}
//将旧阵列更改为新阵列
arr=arr1;
//第一个值是在这里正确打印
printf(“%d\n”,*(arr));
printf(“%p\n”和(*arr));
免费(arr1);
}
//打印输出
for(int i=0;i
C不支持数组分配。你有:
int *arr = malloc (sizeof(int) * a * b);
…
int *arr1 = malloc (sizeof(int) * a * b);
…
arr = arr1;
…
free(arr1);
分配意味着您丢失了原始数组(内存泄漏),然后使用free()
使新数组无效
数组复制需要更多的代码-通常是一个函数调用,如memmove()
或memcpy()
,可能包装在函数中
例如,添加#include
,并用它代替arr=arr1代码>分配:
memmove(arr, arr1, sizeof(int) * a * b);
free(arr1); // No longer needed
或者:
free(arr);
arr = arr1;
这段代码在Mac OS X 10.11.5和GCC 6.1.0上干净地运行,带有处理数组分配的“非此即彼”或“或”选项
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void dump_matrix(const char *tag, int *arr, int a, int b)
{
printf("Matrix: %s\n", tag);
for (int i = 0; i < a; i++)
{
for (int j = 0; j < b; j++)
printf(" %3d", arr[i * b + j]);
putchar('\n');
}
}
int main(void)
{
int a, b, c;
printf("enter the size of matrix: ");
scanf("%d%d", &a, &b);
printf("enter the number of rotations: ");
scanf("%d", &c);
int *arr = malloc(sizeof(int) * a * b);
int x = (a >= b) ? a : b;
printf("enter the values of matrix: ");
// scanning the values
for (int i = 0; i < a; i++)
{
for (int j = 0; j < b; j++)
{
if (scanf("%d", (arr + i * b + j)) != 1)
{
fprintf(stderr, "failed to read value arr[%d][%d]\n", i, j);
return EXIT_FAILURE;
}
}
printf("\n");
}
dump_matrix("Initial input", arr, a, b);
// main code starts
for (int y = 0; y < c; y++)
{
// declared a new array
int *arr1 = malloc(sizeof(int) * a * b);
for (int k = 0; k < x / 2; k++)
{
for (int i = k; i < a - k; i++)
{
for (int j = k; j < b - k; j++)
{
if (i == k && j > k)
{
*(arr1 + i * b + j - 1) = *(arr + i * b + j);
}
else if (i == a - k - 1 && j < b - k - 1)
{
*(arr1 + i * b + j + 1) = *(arr + i * b + j);
}
else if (j == k && i < a - k - 1)
{
*(arr1 + i * b + j + b) = *(arr + i * b + j);
}
else if (j == b - k - 1 && i > k)
{
*(arr1 + i * b + j - b) = *(arr + i * b + j);
}
}
}
if (x % 2 != 0 && a == b)
*(arr1 + x / 2 * b + (b / 2)) = *(arr + x / 2 * b + (b / 2));
}
// Changing the old array to new array
// Either:
// memmove(arr, arr1, sizeof(int) * a * b);
// free(arr1);
// Or:
free(arr);
arr = arr1;
dump_matrix("After rotation", arr, a, b);
}
dump_matrix("Finished", arr, a, b);
free(arr);
return 0;
}
输出是否是您想要的是一个完全独立的讨论。这只是没有滥用内存。描述代码应该实现的功能会很有帮助(“矩阵旋转”可能意味着许多不同的事情)。样本输入和预期与观察到的输出将非常有价值。用代码注释或散文来解释算法的工作原理也不错。正如Jonathan所说,C不支持数组赋值。但这不是真正的问题。您没有分配数组。您正在分配指针。它只复制分配内存的地址,而不是此后存储在那里的数据。逆时针旋转,使[0][0]变成[1][0],[0][1]变成[0][0],依此类推@JohnBollingerm将arr1存储的地址分配给arr..,因为它可以使用数组的地址访问所有值,它必须很容易地打印值。值是相同的,地址是相同的,只是存储它的指针现在有了不同的名称。所以,我不认为这有什么错。@下划线\u dm分配数组的地址而不是数组本身。@arr和arr1是两个指针,它们存储两个不同数组的地址,我只是让arr指向与arr1相同的数组@Jonathan LefflerOK。您可以做到这一点——事实上,所示代码正在使用两个指针并切换赋值。在将原始分配给arr
的内存更改为指向arr1
指向的位置之前,必须跟踪并释放该内存-否则,将泄漏原始分配给arr
的内存。最后,您需要释放指向的内存arr
。如果您即将退出程序,这实际上并不重要,但最好在操作简单的地方释放分配的内存,就像在本代码中一样。使用C,您必须跟踪所有分配的内存,并知道哪个代码将释放它。您不能安全地执行此操作,但问题中的代码无论如何都会执行此操作,即在指针上复制指针的值arr1
,然后释放arr1
,然后再次引用数组。一旦释放数组,无论是通过名称arr
还是arr1
释放,对数据的任何进一步访问都是无效的-未定义的行为-无论是通过名称arr
还是arr1
访问。
$ ./mat31
enter the size of matrix: 3 4
enter the number of rotations: 2
enter the values of matrix: 1 2 3 4 10 11 12 13 99 98 97 96
Matrix: Initial input
1 2 3 4
10 11 12 13
99 98 97 96
Matrix: After rotation
2 3 4 13
1 12 11 96
10 99 98 97
Matrix: After rotation
3 4 13 96
2 11 12 97
1 10 99 98
Matrix: Finished
3 4 13 96
2 11 12 97
1 10 99 98
$