2

我正在更新一个类以使用成员变量而不是#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);
    }
}
4

2 回答 2

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

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

于 2012-11-01T21:08:41.557 回答
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));
}

但这不是大多数人做这项工作的方式。大多数开发人员使用大数组而不是二维数组并尝试自己对其进行索引。像这样:

NSUInteger *fields = malloc(self.kFieldsHeight * self.kFieldsHeight *  sizeof(NSUInteger));
fields[h * width + w] = pixel_value;
于 2012-11-01T21:22:06.893 回答