无符号字符 * 数据作为 c++ 或 c 中函数的返回类型

Muh*_*man 1 c c++ clr return-type visual-studio-2010

我正在使用带有 CLR(通用语言运行时)的 Visual Studio 2010。我想将 unsigned char * 从 compress 函数返回到 main 函数,但是 unsigned char * 和 char * 都给出了错误

“错误 7 错误 C2440:'=':无法从 'char *' 转换为 'unsigned char *' F:\4-2\Thesis\PROJECT\Database Compression Main\Database Compression 2\db_comp_main.cpp 21 “

unsigned char* compressor(char *data)
{
    unsigned char *compressed_string;
    //With some process I had compressed string of data variable as unsigned char* in variable compressed_string successfully and also printed here. Now want to return it from here.
    return compressed_string;
}
int main()
{ 
  unsigned char *main_data; 
  main_data=compressor("Muhammad Ashikuzzaman.Student from Khulna University Of Engineering And Technology from Bangladesh");// When I click the error from error list the cursor is put here beside str by visual studio.
  printf("%s",main_data);
}
Run Code Online (Sandbox Code Playgroud)

需要从压缩函数返回 unsigned char * 类型的数据。请帮忙。

Kai*_*dul 5

更改任何数据类型(函数参数*data或局部变量*main_data)以匹配类型。尝试这个

unsigned char *main_data;
Run Code Online (Sandbox Code Playgroud)

或者....

无论如何,简单的类型转换都可以使其正常工作:

unsigned char* compressor(char *data)
{
    unsigned char *compressed_string;
    compressed_string = (unsigned char*) data;
    return compressed_string;
}
int main()
{
  char *main_data;
  main_data=(char*) compressor("Muhammad Ashikuzzaman.Student from Khulna University Of Engineering And Technology from Bangladesh");
  printf("%s",main_data);
}
Run Code Online (Sandbox Code Playgroud)

或者...

(用 改变一切char*

有三种字符类型:(普通)charsigned charunsigned char。Anychar通常是一个 8 位整数*(在 C 语言中没有专用的“字符类型”),从这个意义上说, asignedunsigned char具有有用的含义(通常等同于uint8_tand int8_t)。当用作文本意义上的字符时,请使用 a char(也称为普通字符)。这通常是一个,signed char但可以由编译器以任何一种方式实现。所以我认为char*在这里使用是安全的。

工作示例(视为char *数据类型):

char* compressor(char *data)
{
    char *compressed_string;
    compressed_string = "compressed";
    // compressed_string = data;
    return compressed_string;
}
int main()
{ 
  char *main_data; 
  main_data=compressor("Muhammad Ashikuzzaman.Student from Khulna University Of Engineering And Technology from Bangladesh");
  printf("%s",main_data);
}
Run Code Online (Sandbox Code Playgroud)

此外,为简单起见,您可以使用指针到指针

void compressor(char **data) {
    *data = "compressed"; // assuming the compressed data will be smaller in length of main data, so buffer overflow won't occur  
}

int main() {
    char *main_data = "Muhammad Ashikuzzaman.Student from Khulna University Of Engineering And Technology from Bangladesh";
    compressor(&main_data);
    printf("%s", main_data);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑

当您询问通过引用传递的替代方法时,除了通过引用传递将数组作为函数参数传递之外,别无他法。因为当你写的时候,void func(char str[])你可能会认为你正在执行pass by value。但是 g++ 编译器会优化语句void func(char &str[0])以避免将整个数组作为函数参数进行处理。因此,在所有情况下,您实际上都是通过引用传递的。