未指定大小的多维数组作为实例变量?

时间:2012-11-07 22:31:48

标签: objective-c c arrays multidimensional-array instance-variables

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

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

@interface ArrayClass : NSObject {

int array[][];

}

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

@end

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

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

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

有人知道我在尝试这个是否可行吗?是否有任何变通方法可以让我在运行时调整数组的大小?或者我是以完全错误的方式解决这个问题?

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

2 个答案:

答案 0 :(得分:3)

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

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

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

如果您需要更多帮助,请查看here

答案 1 :(得分:2)

尽可能使用NSArray或衍生物。如果它必须是C数组,您可以使用单线性malloc()来完成它,并自己为两个维度进行算术运算。即

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

通过偏移算法

访问适当的“单元格”
// access cell at [n,m]
ar[n*ncols+m] = value;

我通常认为这比尝试管理指向数组值的指针数组更简单,但您的里程可能会有所不同。

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