下面正在运行的当前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()的调用函数,该函数从new main()中读取input_text和option值,然后将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( )
}
由于指针问题,在定义char数组时遇到一些错误。如何修改新代码?
答案 0 :(得分:3)
这不起作用:
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) {
此外,您也不能返回数组。例如,您可以返回动态分配的缓冲区,并在输出参数中传递输出缓冲区的大小:
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;
}
当然还有其他可能性,这取决于实际情况。
答案 1 :(得分:3)
您需要以下内容
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 );