首页 > 解决方案 > 如何在不知道要为该指针分配的大小的情况下将指针参数传递给函数

问题描述

我知道这个问题很菜鸟。我试图了解指针是如何工作的。我学习了 C 的基础知识,但仍然不明白这一点。

鉴于此功能:

+ (void)nv21ToRgbWithWidth:(unsigned int)width height:(unsigned int)height yuyv:(unsigned char *)yuyv rgb:(unsigned char *)rgb
{
    const int nv_start = width * height ;
    UInt32 i, j, index = 0, rgb_index = 0;
    UInt8 y, u, v;
    int r, g, b, nv_index = 0;

    for(i = 0; i <  height ; i++)
    {
        for(j = 0; j < width; j ++){
            //nv_index = (rgb_index / 2 - width / 2 * ((i + 1) / 2)) * 2;
            nv_index = i / 2  * width + j - j % 2;

            y = yuyv[rgb_index];
            u = yuyv[nv_start + nv_index ];
            v = yuyv[nv_start + nv_index + 1];


            r = y + (140 * (v-128))/100;  //r
            g = y - (34 * (u-128))/100 - (71 * (v-128))/100; //g
            b = y + (177 * (u-128))/100; //b

            if(r > 255)   r = 255;
            if(g > 255)   g = 255;
            if(b > 255)   b = 255;
            if(r < 0)     r = 0;
            if(g < 0)     g = 0;
            if(b < 0)     b = 0;

            index = rgb_index % width + (height - i - 1) * width;
            rgb[index * 3+0] = b;
            rgb[index * 3+1] = g;
            rgb[index * 3+2] = r;
            rgb_index++;
        }
    }
}

我怎么知道在传递给函数之前应该如何初始化unsigned char *for ?rgb

我尝试像这样调用函数:

unsigned char *rgb = NULL;

[MyClass nv21ToRgbWithWidth:imageWidth height:imageHeight yuyv:yuyvValues rgb:rgb];

但是程序在这一行崩溃了:

rgb[index * 3+0] = b;

我看到rgb是用 NULL 初始化的,所以你不能赋值。因此,我想到了初始化一个数组并将其传递给指针 rgb,如下所示:

unsigned char rgbArr[10000];
unsigned char *rgb = rgbArr;

但该功能仍然崩溃。我真的不知道我应该如何rgb在这个函数中传递参数。请帮助我理解这一点。

标签: objective-cpointers

解决方案


以字节为单位的预期大小似乎至少为height*width*3; 将这样的数组分配为局部变量(如您使用unsigned char rgbArr[10000])可能会超出堆栈限制;在这种情况下,程序可能会崩溃。我会尝试使用堆代替:

unsigned char* rgb = malloc(imageHeight*imageWidth*3);
[MyClass nv21ToRgbWithWidth:imageWidth height:imageHeight yuyv:yuyvValues rgb:rgb];
...
free(rgb);

推荐阅读