matrix rotation..for循环更改指针的值

时间:2016-07-13 17:12:46

标签: 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,&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));

    }

1 个答案:

答案 0 :(得分:0)

C不支持数组赋值。你有:

    int *arr = malloc (sizeof(int) * a * b);
    …
        int *arr1 = malloc (sizeof(int) * a * b);
        …
        arr = arr1;
        …
        free(arr1);

分配意味着您丢失了原始阵列(内存泄漏),然后使用free()使新阵列无效。

数组复制需要更多代码 - 通常是函数调用,例如memmove()memcpy(),可能包含在函数中。

例如,添加#include <string.h>并使用此代替arr = arr1;作业:

    memmove(arr, arr1, sizeof(int) * a * b);
    free(arr1);   // No longer needed

可替换地:

    free(arr);
    arr = arr1;

此代码在Mac OS X 10.11.5上的valgrind下使用GCC 6.1.0以及用于处理数组分配的“Either”或“Or”选项完全运行。

#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;
}

请注意使用dump_matrix()功能。编写这样的函数一次意味着它可以在代码中的多个位置使用。 tag参数简化了使用。 “商业级”变体也采用FILE *fp参数并写入指定的文件流。

请注意主输入循环scanf()上的错误检查。我还应该检查另外两个scanf()语句。当然,错误会报告标准错误。

示例运行:

$ ./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
$

输出是否符合您的意图是一个完全独立的讨论。这根本就不会滥用记忆。