伪泛型嵌套数组内存分配出现指针转整数赋值警告的排查
问题分析与解决
首先明确核心问题:代码左右两边的赋值类型完全不匹配,和你猜测的sizeof无关。
先把宏展开后看代码本质(_SINGARR是char*):
(*((char*) _receptive->__m2dimensio + g_curr++)) = (char*) malloc(sizeof(*((char*)(_generic)) * g));
类型不匹配拆解
- 左边表达式
(*((char*) _receptive->__m2dimensio + g_curr++)):
把_receptive->__m2dimensio转成char*后做指针偏移(偏移g_curr++个char长度),解引用后得到的是单个char值(本质是8位整数)。 - 右边表达式
(char*) malloc(...):
malloc返回的void*被强转为char*,这是一个指针类型(存储内存地址的变量,通常为32/64位)。
把指针(地址值)直接赋值给char类型变量,编译器自然会报"assignment makes integer from pointer without a cast"——相当于把一个大整数(指针)塞到小整数(char)里,还没加显式转换,因此触发警告。
修复方案
你的需求应该是给伪泛型二维数组的某一行分配内存,也就是让左边的变量存储行指针(char*),需要调整左边的类型:
// 将_receptive->__m2dimensio转为char**类型后再操作 *((char**)_receptive->__m2dimensio + g_curr++) = (char*)malloc(sizeof(char) * g);
这样左边是char**指针偏移后解引用,得到的是char*类型变量,和右边的char*指针类型完全匹配,警告就会消失。
另外补充:你代码里的sizeof计算sizeof(*((_SINGARR)(_generic)) * g)其实是没问题的——*(char*)_generic是char,sizeof(char)为1,最终malloc的字节数就是g,这部分逻辑正确。
内容的提问来源于stack exchange,提问作者deft artisan
相关产品推荐
相关产品推荐

