2

我是 OOP 的初学者,所以这可能是一个愚蠢的问题!

我想在objective-c类中使用多维CArray作为实例变量,并且还希望能够在运行时,在对象初始化方法期间指定它的大小:

@interface ArrayClass : NSObject {

int array[][];

}

-(id)initWithSizeX:(int)sizeX sizeY:(int)sizeY;

@end

这会产生错误“实例变量 'array' 的大小未知。”

如果我声明它具有初始大小,我似乎只能使用该数组,例如 [20][20] - 但这当然会破坏这一点,因为我希望它在运行时决定!

我的猜测是这是必要的,因为需要预先知道对象的内存占用?

有谁知道我正在尝试做的事情是否可行?是否有任何解决方法可以让我在运行时调整数组的大小?还是我以完全错误的方式解决这个问题?

我知道有很多关于多维数组的主题,但我似乎找不到任何可以回答我的问题的东西!

4

2 回答 2

3

由于您使用的是 Objective-C,您可能会考虑使用NSArray(或NSMutableArray取决于您计划对数组执行的操作)。这将让您向它发送 Objective-C 消息并“免费”获得更多功能,因为它是一个对象,而不仅仅是一块内存(就像 C 中的数组一样)。此外,如果您使用 ARC 或垃圾收集,它将为您管理内存。

但是如果你知道你想使用一个 C 数组(这是完全有效的),你需要在你的代码中使用malloc它(以及free当你完成它时),就像你通常在 C 中一样。(你只能正如您所指出的,当您在编译时创建一个定义大小的静态数组时可以解决这个问题。)

编辑:正如@Mahesh 在评论中指出的那样,您需要将array变量声明为
int **array;
而不是
int[][] array;.

如果您需要更多帮助,请查看此处!

于 2012-11-07T22:37:33.763 回答
2

如果可能,请使用 NSArray 或派生类。如果它必须是 C 数组,则可以使用单线性 malloc() 来完成,并自己对二维进行算术。IE

int *ar = malloc(sizeof(int) * nrows * ncols);

并通过偏移量的算术访问适当的“单元格”

// access cell at [n,m]
ar[n*ncols+m] = value;

我通常发现这比尝试管理指向值数组的指针数组要简单得多,但是您的里程可能会有所不同。

或者,我将其保存在最后,以防您希望多维动态数组中真正的“多”而不需要行-malloc-happy 列表最建议,并且您的 C 编译器支持 C99 标准中定义的称为 VLA(变量长度数组)。C99 在实现级别支持变量数组声明(即编译器可以支持标准定义的特性,但不是必须的;有关更多信息,请参见 C99 标准的 6.7.6.2)。如果你的编译器不支持它,那么一个预定义的宏,__STDC_NO_VLA__必须定义并且可以在编译时进行测试(参见 C99 标准的第 6.10.8.3-1 节)。话虽这么说,我在过去十年中使用过的每个符合 C99 的编译器都支持它,所以如果你的不支持,请在下面的评论中告诉我们。对于 OP,如果您在 Xcode 中使用 gcc 或 llvm,我保证您会这样做。对于其他任何人,只需测试是否__STDC_NO_VLA__已定义。如果不是,则支持该功能。

int nrows = 10, ncols = 15;
int (*ar)[cols] = malloc(sizeof(int) * nrows * ncols);

请立即注意几件事。分配与之前完全相同。然而,被声明的变量有点不同。这里的声明表明ar它是一个指向ncols整数数组的指针。只要您分配一个倍数ncols(我们通过乘以nrows),现在就可以使用您已经喜欢的熟悉的下标来访问结果矩阵:

// for any n'th row, m'th column
ar[n][m] = value;
于 2012-11-07T22:44:02.963 回答