用[x] [y]访问我的malloc'd 2d数组

时间:2012-11-01 21:05:40

标签: objective-c ios

我正在更新一个类以使用成员变量而不是#defines来定义二维数组的边界。它曾经看起来像:

#define kWidth 3
#define kHeight 100
NSUInteger fields[kWidth][kHeight];

现在,kWidth和kHeight是iVars。我切换到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 fields [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);
    }
}

2 个答案:

答案 0 :(得分:0)

试试这个

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);
    }
}

没有真正的理由这样做,只是另一种方式说[i]是+ i 我在这里使用我的C知识而不是客观的C希望我能帮助

答案 1 :(得分:0)

你需要这样做:

NSUInteger **fields = malloc(self.kFieldsHeight * sizeof(NSUInteger*));
for (int i = 0; i < self.kFieldsHeight; i++) {
     fields[i] = malloc(sizeof(NSUInteger) * self.kFieldsWidth);
     memset(fields, 0xFF,  self.kFieldsWidth * sizeof(NSUInteger));
}

但这不是大多数人做这项工作的方式。大多数开发人员使用大数组而不是2d数组并尝试自己编制索引。像这样:

NSUInteger *fields = malloc(self.kFieldsHeight * self.kFieldsHeight *  sizeof(NSUInteger));
fields[h * width + w] = pixel_value;