You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传递char *array[]作为函数参数仅获首个条目,如何修正?

问题分析与修正

错误原因

  1. 参数类型不匹配:原全局变量option_list是char*类型的数组(本质等价于char**指针),但你修改后的函数参数定义为char *option_list,导致传入的数组结构信息丢失,函数无法识别后续元素。
  2. 指针初始化错误:list_ptr = &option_list让指针指向了函数形参(一个char*变量)的地址,而非数组的首元素地址,遍历仅能获取第一个元素后就会读取无效内存。
  3. 调用方式错误:主程序中load_roller( ui_widget, *list )传入的是数组第一个元素的地址(char*),而非数组本身的地址,进一步导致函数无法遍历完整数组。
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 01:45:39