我是OOP的初学者,所以这可能是一个愚蠢的问题!
我想在Objective-c类中使用多维CArray作为实例变量,并且还希望能够在对象初始化方法期间在运行时指定它的大小:
@interface ArrayClass : NSObject {
int array[][];
}
-(id)initWithSizeX:(int)sizeX sizeY:(int)sizeY;
@end
这会产生错误“实例变量'数组'的大小未知。”
如果我将它声明为具有初始大小,我似乎只能使用数组,例如[20] [20] - 但这当然会失败,因为我希望它在运行时决定!
我猜这是必要的,因为对象的内存占用需要预先知道?
有人知道我在尝试这个是否可行吗?是否有任何变通方法可以让我在运行时调整数组的大小?或者我是以完全错误的方式解决这个问题?
我知道有很多关于多维数组的主题,但我似乎无法找到任何可以回答我问题的内容!
答案 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;