代码:
//arnold add 20211213
size_t save_video_box_buffer_size = 1920*1080*3/2;
char* save_video_box_buffer = (char*)malloc(save_video_box_buffer_size); //开辟一块内存用来存储即将做编码推流的buffer(这先不用队列,看看写视频的速度怎么样先,不行再用队列)
pthread_t main_stream_thread; //
//pthread_create(&main_stream_thread, NULL, MainStream, NULL); //origin
pthread_create(&main_stream_thread, NULL, MainStream, save_video_box_buffer);
警告:
ky_ai_camera_engine_origin.c:1519:45: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [-Wincompatible-pointer-types]
pthread_create(&main_stream_thread, NULL, MainStream, save_video_box_buffer);
^~~~~~~~~~
In file included from /home/yg/rv/sdk/rv1.8/rv1126_rv1109/buildroot/output/rockchip_rv1126_rv1109/build/ky_ai_camera_engine_origin/src/ky_ai_camera_engine_origin.c:7:
/home/yg/rv/sdk/rv1.8/rv1126_rv1109/buildroot/output/rockchip_rv1126_rv1109/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include/pthread.h:236:15: note: expected ‘void * (*)(void *)’ but argument is of type ‘void * (*)(char *)’
void *(*__start_routine) (void *),
~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
原因是pthread_create()传参类型不一致!传的是void*,需要的是char*
可以统统都改成void*,包括malloc
文章目录
20230816
解决C语言编译报错:Initialization from Incompatible Pointer Type
在编程过程中,错误和警告是避不开的。尤其是当我们使用一种像C语言这样强类型的语言时,这些错误和警告变得更为常见。本文将会讨论一种特定的编译时错误:initialization from incompatible pointer type [-Wincompatible-pointer-types],并提供多种可能的解决方案。
一、理解错误
首先,我们需要理解这个错误信息的含义。"Initialization from incompatible pointer type"这句话的字面意思是从不兼容的指针类型进行初始化。换句话说,你正在尝试将一个指针类型赋值给另一个不同的指针类型。
1.1 指针与类型
在C语言中,指针是一个特殊的变量,它存储的是内存地址而非常规的值。每一个指针都有一个特定的类型,这个类型表明了指针指向的内存块包含的数据类型。例如,int *p;
声明了一个名为p的指针,它指向一个整型数据。
如果我们尝试把一个类型的指针赋值给另一个不同类型的指针,编译器就会报出上述的错误。下面的代码就会产生这样的错误:
int *p;
float *q;
p = q; // This will cause a warning
这里,p
是一个指向int
的指针,而q
是一个指向float
的指针。尝试将q
赋值给p
将导致类型不匹配的问题。
二、解决方法
有多种方式可以解决此类问题,接下来我们将一一探讨。
2.1 类型转换
最直接的解决办法是进行类型转换。在C语言中,我们可以使用强制类型转换来改变某个表达式的数据类型。修改后的代码如下:
int *p;
float *q;
p = (int*)q; // This is now valid
这里,我们使用(int*)
来将q
的类型强制转换为int *
。这样,q
就可以成功地赋值给p
了。
然而,虽然这样可以解决编译时错误,但是并不推荐这样做,因为这样可能会导致运行时错误。在上面的例子中,p
现在指向一个浮点数,但是被当作整数来处理,这可能会导致不可预知的结果。
2.2 使用void指针
另一种解决办法是使用void
指针。void
指针是一种特殊的指针类型,它可以指向任何类型的数据。因此,我们可以先将q
赋值给一个void
指针,然后再将这个void
指针赋值给p
。示例代码如下:
int *p;
float *q;
void *temp;
temp = q;
p = temp; // This is now valid
在这里,temp
是一个void
指针,它可以接收任何类型的指针。所以,我们可以先将q
赋值给temp
,然后再将temp
赋值给p
。
需要注意的是,虽然void
指针可以指向任何类型的数据,但是在对void
指针进行解引用操作时,必须先将它转换为具体的类型。也就是说,如果你想获取p
所指向的值,你需要这样做:
int value = *(int *)p;
这里,我们首先将p
转换为int *
类型,然后对其进行解引用,以获取它所指向的值。
2.3 检查函数参数
如果你在函数调用中遇到了这个问题,那么可能是因为你的函数参数类型与实际传入的参数类型不匹配。例如,你可能有这样一个函数:
void foo(int *p);
然后你可能这样调用这个函数:
float *q;
foo(q); // This will cause a warning
这将导致上述的警告,因为foo
期望一个int *
类型的参数,但是我们传入了一个float *
类型的参数。解决这个问题的方法是确保你传入正确类型的参数。
ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ
ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ
ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ
ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ