Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 矩阵旋转..for循环更改指针的值_C - Fatal编程技术网

C 矩阵旋转..for循环更改指针的值

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,&

在数组的最终值中,只有第一个元素变为零,当它再次进入for循环时(使用gdb检查)…我在代码底部提到了使用注释的问题。请帮我解决。。我不知道出了什么问题

 #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
$