此数组分配的 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 }\nRun Code Online (Sandbox Code Playgroud)\n\nMingwout of memory在 18 \xe2\x80\x93 26 分配后给出错误,无论 M、N、O、P 的大小如何。
在 Linux gcc 上运行相同的代码会立即产生错误和段错误
\n\n此代码的 3 维版本(仅少一个 for 循环)可以工作并且不会产生错误。
\n\n明格输出:
\n\nAllocation: 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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n\n编辑:这根本不是指针符号问题。在打印语句中有一个随机的“==”而不是“=”和错误的“)”。
\nA[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)