4 维数组的指针语法

Bit*_*ass 0 c

此数组分配的 3D 版本似乎工作正常,但添加第四个维度显然会导致段错误。编辑:(事实证明指针的东西很好,只是内部循环中有一对拼写错误)

\n\n
    #include <stdio.h>\n    #include <stdlib.h>\n\n    #define M 2\n    #define N 3\n    #define O 4\n    #define P 5\n\n    int main()\n    {\n        int ****A = malloc(sizeof(int***)*M);\n        int i, j, k, m;\n\n        if(!A) \n        {\n            printf (" **** Out of Memory");\n        }\n        for(i = 0; i < M; i++)\n        {\n            A[i] = malloc(sizeof(int**)*N);\n            if(!A[i]) \n            {\n                 printf(" *** Out of Memory");\n            }\n            for(j = 0; j < N; j++)\n            {\n                A[i][j] = malloc(sizeof(int*)*O);\n                if(!A[i][j]) \n                {\n                    printf(" ** Out of Memory");\n                }\n                for(k = 0; k < O; k++)\n                {\n\n/* TYPO 1 - former site of main problem, a "==" typo */\n                    A[i][j][k] = malloc(sizeof(int)*P); \n                    if(!A[i][j][k]) \n                    {\n                        printf(" * Out of Memory\\n");\n                    }\n\n/* TYPO 2 - former site of ")A;" typo unrelated to main problem */\n                    printf("Allocation: A[i][j][k] at %p, A[i][j]: %p, A[i]: %p, A: %p\\n", A[i][j][k], A[i][j], A[i], A); \n                }\n            }\n        }\n        return 0;\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

Mingwout of memory在 18 \xe2\x80\x93 26 分配后给出错误,无论 M、N、O、P 的大小如何。

\n\n

在 Linux gcc 上运行相同的代码会立即产生错误和段错误

\n\n

此代码的 3 维版本(仅少一个 for 循环)可以工作并且不会产生错误。

\n\n

明格输出:

\n\n
Allocation: A[i][j][k] at 00B326F8, A[i][j]: 00B30D60, A[i]: 00B30D48, A: 76FD74CD\n\nAllocation: A[i][j][k] at 00B300C0, A[i][j]: 00B30D60, A[i]: 00B30D48, A: 76FD74CD\n\nAllocation: A[i][j][k] at 69575C3A, A[i][j]: 00B30D60, A[i]: 00B30D48, A: 76FD74CD\n\nAllocation: A[i][j][k] at 776F646E, A[i][j]: 00B30D60, A[i]: 00B30D48, A: 76FD74CD\n\nAllocation: A[i][j][k] at 00B33700, A[i][j]: 00B30DF8, A[i]: 00B30D48, A: 76FD74CD\n\nAllocation: A[i][j][k] at 00B300C0, A[i][j]: 00B30DF8, A[i]: 00B30D48, A: 76FD74CD\n\nAllocation: A[i][j][k] at 45434F52, A[i][j]: 00B30DF8, A[i]: 00B30D48, A: 76FD74CD\n\nAllocation: A[i][j][k] at 524F5353, A[i][j]: 00B30DF8, A[i]: 00B30D48, A: 76FD74CD\n\nAllocation: A[i][j][k] at 00B33700, A[i][j]: 00B30E90, A[i]: 00B30D48, A: 76FD74CD\n\nAllocation: A[i][j][k] at 00B300C0, A[i][j]: 00B30E90, A[i]: 00B30D48, A: 76FD74CD\n\nAllocation: A[i][j][k] at 6F646E69, A[i][j]: 00B30E90, A[i]: 00B30D48, A: 76FD74CD\n\nAllocation: A[i][j][k] at 535C7377, A[i][j]: 00B30E90, A[i]: 00B30D48, A: 76FD74CD\n\nAllocation: A[i][j][k] at 00B33700, A[i][j]: 00B30F40, A[i]: 00B30F28, A: 76FD74CD\n\nAllocation: A[i][j][k] at 00B300C0, A[i][j]: 00B30F40, A[i]: 00B30F28, A: 76FD74CD\n\nAllocation: A[i][j][k] at 6D766E44, A[i][j]: 00B30F40, A[i]: 00B30F28, A: 76FD74CD\n\nAllocation: A[i][j][k] at 5C3A433B, A[i][j]: 00B30F40, A[i]: 00B30F28, A: 76FD74CD\n\nAllocation: A[i][j][k] at 00B30FD8, A[i][j]: 00B304A0, A[i]: 00B30F28, A: 76FD74CD\n\nAllocation: A[i][j][k] at 00B300C0, A[i][j]: 00B304A0, A[i]: 00B30F28, A: 76FD74CD\n\nAllocation: A[i][j][k] at 00000231, A[i][j]: 00B304A0, A[i]: 00B30F28, A: 76FD74CD\n\n * Out of Memory\n\nAllocation: A[i][j][k] at 00000000, A[i][j]: 00B304A0, A[i]: 00B30F28, A: 76FD74CD\n\nAllocation: A[i][j][k] at 00B304D8, A[i][j]: 00B313E0, A[i]: 00B30F28, A: \n76FD74CD\n\nAllocation: A[i][j][k] at 00B300C0, A[i][j]: 00B313E0, A[i]: 00B30F28, A: 76FD74CD\n\nAllocation: A[i][j][k] at 6F646E69, A[i][j]: 00B313E0, A[i]: 00B30F28, A: 76FD74CD\n\nAllocation: A[i][j][k] at 00007377, A[i][j]: 00B313E0, A[i]: 00B30F28, A: 76FD74CD\n\nProcess returned 255 (0xFF)   execution time : 3.891 s\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 Linux 上,相同的代码会生成:

\n\n
* Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x9617028, A[i]: 0x9617018, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x9617028, A[i]: 0x9617018, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x9617028, A[i]: 0x9617018, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x9617028, A[i]: 0x9617018, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x96170a0, A[i]: 0x9617018, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x96170a0, A[i]: 0x9617018, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x96170a0, A[i]: 0x9617018, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x96170a0, A[i]: 0x9617018, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x9617118, A[i]: 0x9617018, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x9617118, A[i]: 0x9617018, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x9617118, A[i]: 0x9617018, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x9617118, A[i]: 0x9617018, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x96171a0, A[i]: 0x9617190, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x96171a0, A[i]: 0x9617190, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x96171a0, A[i]: 0x9617190, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x96171a0, A[i]: 0x9617190, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x9617218, A[i]: 0x9617190, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x9617218, A[i]: 0x9617190, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x9617218, A[i]: 0x9617190, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x9617218, A[i]: 0x9617190, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x9617290, A[i]: 0x9617190, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x9617290, A[i]: 0x9617190, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x9617290, A[i]: 0x9617190, A: 0x24ab80\n\n * Out of Memory\n\nAllocation: A[i][j][k] at (nil), A[i][j]: 0x9617290, A[i]: 0x9617190, A: 0x24ab80\n\nSegmentation fault\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑:这根本不是指针符号问题。在打印语句中有一个随机的“==”而不是“=”和错误的“)”。

\n

use*_*738 5

A[i][j][k] == (int*)malloc(sizeof(int)*P);
Run Code Online (Sandbox Code Playgroud)

然后你尝试访问它

if(!A[i][j][k])
Run Code Online (Sandbox Code Playgroud)

给你分段错误。

3这对维度有用吗?没有。也许是因为你当时没有这个循环。

修正将是

A[i][j][k] = malloc(sizeof(int)*P);
Run Code Online (Sandbox Code Playgroud)

你不需要那个转换——它是多余的。

此外,如果您这样做,所有这 4 个 malloc 都会变得更加干净和无忧

int ****A = malloc(sizeof *A * M);
Run Code Online (Sandbox Code Playgroud)

A[i] = malloc(sizeof *A[i] * N);
Run Code Online (Sandbox Code Playgroud)

也像这样编译你的代码

gcc -Wall -Werror progname.c
Run Code Online (Sandbox Code Playgroud)

这将发出警告,让您意识到这个平等问题。

插图代码:-

#include <stdio.h>
#include <stdlib.h>

#define M 2
#define N 3
#define O 4
#define P 5

int main(void)
{
    int ****A = malloc(sizeof*A*M);


    if(!A)
    {
        perror(" *** Out of Memory");
        exit(EXIT_FAILURE);
    }
    for(size_t i = 0; i < M; i++)
    {
        A[i] = malloc(sizeof *A[i]*N);
        if(!A[i])
        {
            perror(" *** Out of Memory");
            exit(EXIT_FAILURE);
        }
        for(size_t j = 0; j < N; j++)
        {
            A[i][j] = malloc(sizeof(int*)*O);
            if(!A[i][j])
            {
                perror(" *** Out of Memory");
                exit(EXIT_FAILURE);
            }
            for(size_t k = 0; k < O; k++)
            {
                A[i][j][k] = malloc(sizeof *A[i][j][k]*P);
                if(!A[i][j][k])
                {
                    perror(" *** Out of Memory");
                    exit(EXIT_FAILURE);
                }
                printf("Allocation: A[i][j][k] at %p, A[i][j]: %p, A[i]: %p, A: %p\n", (void*)A[i][j][k], (void*)A[i][j], (void*)A[i], (void*)A);
            }
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)