【问题标题】:Segmentation fault 11 Objective-C, but not in C分段错误 11 Objective-C,但不在 C 中
【发布时间】:2017-04-16 17:39:59
【问题描述】:

我目前正在尝试在 Objective-C 中创建一个 16 位/通道或 48bpp 图像作为数组,然后将其放入 NSBitmapImageRep。首先,我只想用噪音填充它以查看它是否有效,所以我使用了 C for 循环,由于某种原因,它创建了一个分段错误 11,我看不出这是怎么可能的。我已经在一个简单的.c 文件中尝试了这个 EXACT 代码 sn-p,它工作得非常好。顺便说一句,这是在应用程序的主要功能中发生的,我希望通过单击按钮的方法来完成,但不知道如何从那里访问数组,因为它不是全局的(也可以使用一些提示)。 我也试过用uint8_t代替16位像素,没有什么区别。

int sizeElements = 1880 * 1056 * 3;
int sizeBytes = sizeElements * sizeof(uint16_t);
uint16_t * imagearray = (uint16_t *)malloc(sizeBytes);
for (int i = 1; i < sizeElements; i++) 
{
    imagearray[i] = rand() % 65536;
}
NSBitmapImageRep * theBitmap = [
    [NSBitmapImageRep alloc] 
    initWithBitmapDataPlanes: (unsigned char * _Nullable * _Nullable)imagearray
    pixelsWide: 1880
    pixelsHigh: 1056
    bitsPerSample: 16
    samplesPerPixel: 3
    hasAlpha: NO 
    isPlanar: NO 
    colorSpaceName: @"NSDeviceRGBColorSpace"
    bitmapFormat: 0 
    bytesPerRow: 1880 * 3 * 2
    bitsPerPixel: 48
];

感谢任何知道的人,这已经伤害了我好几个小时:(

edit:使用 NULL 作为位图数据平面进行初始化可以消除错误,但删除 for 循环也是如此。为什么会这样,我怎样才能让它工作?

编辑:添加 & 像这样:&amp;imagearray 帮助,感谢@everyoneWhoAnswered

【问题讨论】:

  • 有什么理由不初始化数组的第一个元素?另外,您是否正在检查对malloc 的调用是否成功?请注意,仅仅因为它不会在 C 中崩溃并不一定意味着那里不存在相同的错误。这只是意味着它没有在那里触发崩溃。
  • 为什么不设置元素[0]?
  • @user1118321 感谢您指出随机的事情,但它没有帮助,我可能在尝试查找错误时这样做了。
  • @AnttiHaapala 我想我可能这样做是为了找到问题,但事实证明它不会导致问题。无论如何感谢您指出这一点。

标签: objective-c c image cocoa bitmap


【解决方案1】:

平面数组不是像素数据,它是指向像素数据的指针数组。您需要在两者之间放置另一个数组。

在您的情况下,由于您的图像不是平面的,因此这是一个数组,其第一个元素中包含像素数据指针,其他元素设置为 NULL。

【讨论】:

  • 或者,只传递&amp;imageArray 而不是imageArray
  • @user1118321 和 uliwitness 谢谢,完全忘记了尝试。非常感谢!对不起,noobyness。
猜你喜欢
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
相关资源
最近更新 更多