Return 整个 unsigned char 数组到 main

Return the whole unsigned char array to main

下面的当前 main(),现在正在运行,用于修改输入数组的大小和值,并生成输出数组。

int main()
{
    unsigned char input_text[] = {0x00, 0x01, 0x02 ....};
    int ilength = sizeof(input_text)/sizeof(input_text[0]);

    int *olength;
    olength = &ilength;
    unsigned char* output_text = (unsigned char*)malloc(sizeof(unsigned char)*(*olength));

    int option = 1;
    switch(option)
    {   // array size and some elements values will be changed below
     case 1:
        change_output_method_1(&output_text, input_text, ilength, olength);
        // void change_output_method_1(unsigned char** output, unsigned char* input, int inlen, int *olen);
    }

    return 0;
}

现在,我想将上面的 main() 修改为名为 change( ) 的调用函数,它从新的 main( ) 中读取 input_text 和选项值,以及 return output_text 新 main() 的值。

当然,再创建一个新的main()来调用change()。

unsigned char* change(unsigned char input_text, int option)
{
    int ilen = sizeof(input_text)/sizeof(input_text[0]);

    (same as before)

    return output_text;
}

int main()
{
    int opt = 1;
    unsigned char input[] = {same};

    unsigned char output[] = change(input, opt);
    // IMPORTANT: output[] size is unknown before receiving the return value from change( )
}

由于指针问题,我在定义字符数组时遇到了一些错误。如何修改新代码?

这不起作用:

unsigned char output[] = change(input, opt);

...

unsigned char* change(unsigned char input_text, int option)

您不能将数组传递给 change 函数。您必须传递一个指向数组的指针(技术上准确:指向数组的第一个元素),以及大小:

unsigned char output[] = change(input, sizeof(input), opt);

...

unsigned char* change(unsigned char *input_text, int ilen, int option) {

此外,您也不能 return 数组。例如,您可以 return 一个动态分配的缓冲区,并在输出参数中传递输出缓冲区的大小:

int output_size;
char *output = change(input, sizeof(input), &output_size, opt);

...

unsigned char* change(unsigned char *input_text, int ilen, int *olen, int option) {
    char *ret = malloc(SIZE);
    *olen = SIZE;

    return ret;
}

当然还有其他的可能,具体要看具体情况。

您需要以下内容

unsigned char * change( const unsigned char *input_text, size_t n, int option )
{
    unsigned char *output_text = malloc( n * sizeof(unsigned char) );

    (same as before)

    return output_text;
}

并称其为

unsigned char *output_text = change( input_text, 
                                     sizeof( input_text ) / sizeof( *input_text ), 
                                     option );

用作函数参数的数组被隐式转换为指向其第一个元素的指针。

并且声明为数组的函数参数被编译器调整为指向数组元素类型的指针。

也就是说函数内部input_text是一个指针。您必须显式传递数组的大小。

如果输出数组的大小可能与输入数组的大小不同,则可以采用以下方法。

在 main 中声明一个指针

unsigned char *output_text = NULL;

本例中的函数声明如下所示

size_t change( const unsigned char *input_text, unsigned char **output_text, size_t n, int option )
{
    size_t size = /* some initializer expression */;
    *output_text = malloc( size * sizeof(unsigned char) );

    (same as before)

    return size; // where size is the size of the array output_text
}

并且该函数将被调用为

size_t olength = change( input_text, 
                         sizeof( input_text ) / sizeof( *input_text ),
                         &output_text,
                         option );