如果有人愿意分享声明这样的数组的语法,我将不胜感激。
如果你想分配某种类型的数组,你需要将它分配给该类型的指针。
由于2D数组是数组的数组(在您的情况下,是512个256个字符的数组),因此您应该将其分配给指向256个字符的数组的指针:
char (*arr)[256]=malloc(512*256);
//Now, you can, for example:
arr[500][200]=75;
(将 *arr
周围的圆括号添加是为了将其转换为指向数组的指针,而不是指针数组。)
n
和m
的值,并声明一个char arr[n][m]
数组,或者在这种情况下使用char (*arr)[n]
。 - Kos假设你不需要与古老的C89标准兼容(目前只有MSVC和一些嵌入式目标编译器是如此过时的)。以下是如何实现:
int (*array)[cols] = malloc(rows * sizeof *array);
对于任何 a
在 [0, rows)
和 b
在 [0, cols)
的值,array[a][b]
是有效的。
在C标准语言中,array
具有可变修改类型。如果您想把指针传递给其他函数,则需要在函数参数列表中重复这种类型,并确保至少传递了列数作为函数的一部分(因为它是可变修改类型的一部分)。
编辑: 我错过了 OP 只关心固定大小为 512x256 的事实。在这种情况下,C89 就足够了,你只需要:
int (*array)[256] = malloc(512 * sizeof *array);
如果你需要在函数之间传递指针,那么完全相同的类型可以在函数参数列表中使用(也可以作为函数返回类型,但是对于这种情况,你可能需要使用typedef... :-))
malloc
,您只能调用一次free
;这是绝对正确的。array
不是指针数组,而是数组的数组。每个array[i]
衰减为指向其第一个元素的指针,但array[i]
是一个数组。 - R.. GitHub STOP HELPING ICE如果您像这样分配数组,则需要两次调用free
,但它允许使用array[a][b]
样式语法,并且是连续的。
char **array = malloc(512 * sizeof(char *));
array[0] = malloc(512*256);
for (int i = 1; i < 512; i++)
array[i] = array[0] + (256 * i);
更多信息请查看这里的array2
: http://c-faq.com/aryptr/dynmuldimary.html
char
分配了空间,然后将其视为足够容纳 512 个 char *
的空间。 这几乎肯定会超出分配的末尾并导致崩溃。 - zwolmalloc
。这简化了错误处理(无需清除部分失败的情况),并确保内存局部性。 - R.. GitHub STOP HELPING ICE由于您事先知道数组的大小,因此可以创建一个包含521x256数组的struct
类型,然后动态分配struct
。
可以动态分配与多维数组相同类型的数组。
static char x[512][256];
这个东西是给你的,但由于类型衰变的原因它有点棘手。我只知道如何通过 typedef
来实现:
typedef char row[512];
row *x = malloc(sizeof(row) * 256);
这只能让您在运行时确定第二个维度的大小。如果两个维度都可以在运行时变化,那么您需要一个dope向量。
如果你知道数组的大小,你可以使用 typedef
来定义它,并创建一个指向它的指针。下面是一个简短的示例,演示了这种用法:
#include <stdio.h>
#include <stdlib.h>
typedef int array2d[20][20];
int main() {
int i,j;
array2d *a = malloc(sizeof(array2d));
for(i=0;i!=20;i++)
for(j=0;j!=20;j++)
(*a)[i][j] = i + j;
for(i=0;i!=20;i++)
for(j=0;j!=20;j++)
printf("%d ",(*a)[i][j]);
free(a);
return 0;
}
(*a)
而不是简单的a
的地方。如果你只放置列数,它会工作得更好。当然,在C99中,你可以使类型可变修改;我相信只要typedef具有块范围而不是文件范围,这甚至在typedef中也是有效的。 - R.. GitHub STOP HELPING ICE char (*array)[81];
int lineCount;
/* Go get your lineCount.*/
lineCount = GetFileLines("text.fil");
array = malloc(lineCount * 81);
这就是我们在早期实现“VLA”的方式。它的工作原理与现在完全相同。
char (*array)[81] = malloc(lineCount * 81); /* error pre C99 */
没有 VLA 的奢侈。
只是我陈旧而发黑的 2 分钱。