传递char *array[]作为函数参数仅获首个条目,如何修正?
问题分析与修正
错误原因
- 参数类型不匹配:原全局变量
option_list是char*类型的数组(本质等价于char**指针),但你修改后的函数参数定义为char *option_list,导致传入的数组结构信息丢失,函数无法识别后续元素。 - 指针初始化错误:
list_ptr = &option_list让指针指向了函数形参(一个char*变量)的地址,而非数组的首元素地址,遍历仅能获取第一个元素后就会读取无效内存。 - 调用方式错误:主程序中
load_roller( ui_widget, *list )传入的是数组第一个元素的地址(char*),而非数组本身的地址,进一步导致函数无法遍历完整数组。 - for循环参数错误:
&option_list[idx]是char***类型,与snprintf需要的char*字符串地址类型不匹配,会引发未定义行为。
修正后的代码
函数定义
void load_roller( lv_obj_t *roller, char **option_list ) { char *roller_options; char *ptr, **list_ptr; uint16_t idx; uint32_t buf_size = 0, entry_cnt = 0; list_ptr = option_list; while( *list_ptr != NULL ) { buf_size += strlen( *list_ptr++ ); entry_cnt++; } buf_size += entry_cnt; // 预留换行符和终止NULL的空间 roller_options = malloc( buf_size ); ptr = roller_options; for( idx = 0; idx < entry_cnt; idx++ ) { ptr += snprintf( ptr, (buf_size - (ptr - roller_options)), "%s\n", option_list[idx]); } *(ptr-1) = 0; // 移除最后一个换行符,用NULL终止字符串 lv_roller_set_options(roller, roller_options, LV_ROLLER_MODE_NORMAL); free( roller_options ); }
主程序调用
// 示例数组定义 char *list[] = { "Option 1", "Option 2", "Option 3", // ... 其他选项 NULL }; // 直接传入数组名(自动退化为char**指针) load_roller( ui_widget, list );
关键说明
- 函数参数改为
char **option_list,匹配数组的实际类型,确保能正确遍历每个字符串指针。 list_ptr直接赋值为option_list,从数组首元素开始遍历,直到遇到NULL终止符。- 调用时传入数组名即可,无需解引用(
*list),数组名会自动转换为指向首元素的指针。 - for循环中用
option_list[idx]直接获取对应字符串的地址,符合snprintf的参数要求。
内容的提问来源于stack exchange,提问作者Deadeye5589
相关产品推荐
相关产品推荐

