传递二维char字符串数组到函数后调用strcpy出现访问错误如何解决?
问题根源
问题出在二维char数组的传参类型不匹配上,strcpy的调用逻辑本身没有问题。
类型差异解释
你定义的char building_category_names_UPPER_CASE[][30]是连续存储的定长二维字符数组,内存布局为所有字符串按每行固定30字节连续排布,数组名的实际类型是char (*)[30](指向长度为30的char数组的指针),不是char**。
而函数参数char** list的含义是指向char指针数组的指针,预期list指向的内存中存储的是一个个独立的char*地址,每个地址再指向分散存储的字符串。
当你把二维数组直接传入接收char**的函数时,编译器会做隐式类型转换,此时访问list[i]会把二维数组中实际存储的字符内容当成内存地址去读取,自然触发访问违规错误。
修复方案
你可以选择以下任意一种方案修复:
- 方案1:修改函数参数适配二维数组
将函数的第一个参数类型改为和输入数组匹配的格式:
此时编译器会自动按每行30字节的偏移计算// 两种写法等价,都表示指向长度30的char数组的指针 void Create_Button_List(char list[][30], int list_size, char* group_name, int pos_x, int pos_y) // 或 void Create_Button_List(char (*list)[30], int list_size, char* group_name, int pos_x, int pos_y)list[i]的地址,可正确读取字符串。 - 方案2:修改原数组定义适配
char**参数
如果你希望函数保留char**的通用写法,可将原数组改为指针数组类型:
该数组的元素是独立的char*指针,数组名类型天然为char* building_category_names_UPPER_CASE[] = { "NOTHING", "WAREHOUSE", "PROCESSING PLANT", "FACTORY", "OFFICE" };char**,可直接传入原函数正常使用。
补充说明
Visual Studio编译未报错是因为默认对指针隐式转换的检查等级较低,建议开启/W4警告等级,可在编译阶段提前发现这类类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Dinosbacsi
相关产品推荐
相关产品推荐

