[英]warning: return from incompatible pointer type [-Wincompatible-pointer-types]|
[英]converting Big endian to little endian in c. warning:return from incompatible pointer type [-Wincompatible-pointer-types] return src;
函数convertEndian()
的目的是将 big endian 转换为 little endian
警告:从不兼容的指针类型返回 [-Wincompatible-pointer-types] 返回 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 *
— 不需要其他更改(尽管您可以编写return src;
如果您真的想这样做)。
您可以使用任何 8 位整数类型来代替char
— 因此可以使用signed char
、 unsigned char
、 int8_t
或uint8_t
来代替,基本上没有区别。 我忽略了CHAR_BITS > 8
的可能性; 如果这对您来说是个问题,那么需要重新考虑。 如果你使用return src;
并且src
的类型与函数的返回类型不匹配,那么您必须对其进行强制转换,或者恢复为return source;
.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.