0

私はそのように配列を初期化しました

CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage, bounds);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
unsigned char *rawData = malloc(height * width * 4);
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

ただし、NSLog でカウントを確認しようとすると、常に 4 (具体的には 4/1) になります。

int count = sizeof(rawData)/sizeof(rawData[0]);
NSLog(@"%d", count);

しかし、個々の要素の値を NSLog すると、ゼロ以外の値が返されます。

元。
CGFloat f1 = rawData[15];

CGFloat f2 = rawData[n]、どこnですimage width*height*4;

//最後の要素は n-1 でなければならないので、これがうまくいくとは思っていませんでした

最後に、私は試しました

int n = lipBorder.size.width *lipBorder.size.height*4*2; //lipBorder holds the image's dimensions, I tried multiplying by 2 because there are 2 pixels for every CGPoint in retina
CGFloat f = rawData[n];

これは、同じ画像に対して毎回異なる値を返します (例: 0.000、115.000、38.000)。

カウントを決定するにはどうすればよいですか / 値はどのように配列に格納されますか?

4

2 に答える 2

0

malloc によって返されるポインターは、メモリ内のアドレスへのポインターを返すことを意味する void* ポインターです。返されている幅と高さが 0 のようです。これは、配列に 4 バイトしか割り当てられていない理由を説明しています。

あなたも試したと言いました

int n = lipBorder.size.width *lipBorder.size.height*4*2; //lipBorder holds the image's dimensions, I tried multiplying by 2 because there are 2 pixels for every CGPoint in retina
    CGFloat f = rawData[n];    

毎回異なる値を受け取っていました。この動作は、配列の長さが 4 バイトしかなく、メモリのはるか先にあるメモリ領域にアクセスしていることを考えると、予期されることです。値が変更された理由は、配列にないメモリにアクセスしていたためでしたが、配列 lipBorder.size.width *lipBorder.size.height*4*2 - 4の末尾を通過したバイト数のメモリ位置にありました。C は、プログラム内のメモリへのアクセスを決して妨げません。プログラムに制限されていないメモリにアクセスした場合、セグメンテーション違反が発生します。

したがって、 orn + 1要素にアクセスできます。これは、配列の最後に渡されたメモリにアクセスしていることを意味するだけです。n + 2n + whatever

ポインタ rawdata をインクリメントすると、メモリ アドレスが 1 バイト移動します。インクリメントおよび int ポインタは、メモリ アドレスを 4 バイト (sizeof(int)) ずつインクリメントします。

于 2013-08-18T22:05:40.773 に答える