我正在更新一个类以使用成员变量而不是#defines 来定义二维数组的边界。它曾经看起来像:
#define kWidth 3
#define kHeight 100
NSUInteger fields[kWidth][kHeight];
现在 kWidth 和 kHeight 是 iVar。我切换到 malloc 约定,因为我看不到其他选择,因为边界现在可以改变。问题是我无法使用两个 [] ([][]) 访问数组。请参阅我的内联评论。我确信我已经正确地 malloc 了。我以前做过很多次,在 iOS 下。为什么我不能通过这种方式访问?
self.kFieldsHeight = 100; self.kFieldsWidth = 3; NSUInteger** fields = (NSUInteger**)malloc(sizeof(NSUInteger) * self.kFieldsHeight * self.kFieldsWidth); memset(fields, 0xFF, self.kFieldsWidth * self.kFieldsHeight * sizeof(NSUInteger)); //// Now with LLDB I can examine the array in one dimension // p fields[0] // 0xFFFFFFFF // p fields[299] // 0xFFFFFFFF // p fields[300] // 0xGARBAGE //// THIS fails with "error: Couldn't dematerialize struct : Couldn't read a composite type from the target: gdb remote returned an
错误:E08" // p 字段[0][0]
// Thus this fails in my code NSUInteger i = fields[0][0];
这是怎么回事?
编辑:(更详细)我也尝试过这样的 mallocing:
fields = (NSUInteger**)malloc(sizeof(NSUInteger*) * self.kFieldsHeight);
if(fields){
for(int i = 0; i < self.kFieldsHeight; i++){
fields[i] = (NSUInteger*)malloc(sizeof(NSUInteger) * self.kFieldsWidth);
}
}
编辑:(更详细)。我用相同的结果交换了宽度和高度:
fields = (NSUInteger**)malloc(sizeof(NSUInteger*) * self.kFieldsWidth);
if(fields){
for(int i = 0; i < self.kFieldsWidth; i++){
fields[i] = (NSUInteger*)malloc(sizeof(NSUInteger) * self.kFieldsHeight);
}
}