函数convertEndian()
的目的是将大字节序转换为小字节序
警告:从不兼容的指针类型返回[-Wincompatible-pointer-types] return src;
问题与返回类型有关,其中一个是char **
,另一个是char *
我需要char **
以便进行交换,但再次需要返回类型为char *
。那你有什么建议吗?
char *convertEndian(void *source)
{
typedef unsigned char EightBytes[8];
unsigned char temp;
// char **src = (char **)malloc(1000 * sizeof(char *));
// char *temp = (char *)malloc(1000 * sizeof(char));
EightBytes *src = (EightBytes *)source;
temp = (*src)[0];
(*src)[0] = (*src)[7];
(*src)[7] = temp;
temp = (*src)[1];
(*src)[1] = (*src)[6];
(*src)[6] = temp;
temp = (*src)[2];
(*src)[2] = (*src)[5];
(*src)[5] = temp;
temp = (*src)[3];
(*src)[3] = (*src)[4];
(*src)[4] = temp;
return src; //shows warning for this part
}
//convertEndian function will be used inside this function
int getHeaderSize(unsigned char * header)
{
char * headerSize = (char *)malloc(9 * sizeof(char));
for (int i = 0; i < 8; i += 2)
{
headerSize[i] = header[i + 20];
headerSize[i + 1] = header[i + 21];
}
headerSize[8] = '\0';
headerSize = convertEndian(headerSize);
int size = hex2int(headerSize);
return size;
}
我不确定我是否会费心找出问题代码中正在进行的存储(错误)管理。一种更简单的工作方式是:
extern void *convertEndian(void *source);
void *convertEndian(void *source)
{
char *src = source;
for (int i = 0, j = 7; i < j; i++, j--)
{
char tmp[1];
tmp[0] = src[i];
src[i] = src[j];
src[j] = tmp[0];
}
return source;
}
tmp
使用数组是常规的;你完全可以写:
extern void *convertEndian(void *source);
void *convertEndian(void *source)
{
char *src = source;
for (int i = 0, j = 7; i < j; i++, j--)
{
char tmp = src[i];
src[i] = src[j];
src[j] = tmp;
}
return source;
}
如果您希望手动解开循环而不是依靠编译器进行优化,那是您的特权。
如果您坚持要返回char *
,则将返回类型从void *
更改为char *
-不需要其他更改。