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

EM_JS:如何将C/C++的int argc、char** argv转为JS字符串数组?

解决Emscripten中C/C++ char** 转JS字符串数组的问题

你的问题核心是没正确处理Emscripten的内存模型——当char** argv传递到JS端时,它只是一个指向C内存区域的整数地址,并非可直接遍历的数组,直接用argv[i]访问会拿到错误的内存值,导致UTF8ToString解析出空字符串。

修复方案

我们需要借助Emscripten提供的内存视图(比如HEAPU32),先读取指针数组里的每个字符串地址,再转换为JS字符串。修改你的EM_JS代码如下:

#include <stdio.h>
#include <emscripten.h>

EM_JS(void, call_myFunc, (int argc, char **argv), {
  var arr = [];
  // 将argv指针转为Uint32Array视图,每个元素对应一个C字符串的指针地址
  var ptrArray = new Uint32Array(HEAPU32.buffer, argv, argc * 4);
  for (let i = 0; i < argc; i++) {
    // 读取每个字符串的指针地址,再转换为JS字符串
    arr.push(UTF8ToString(ptrArray[i]));
  }
  myFunc(arr);
});

int main() {
  int argc = 4;
  char *argv[] = { "ab", "cd", "ef", "gh" };
  call_myFunc(argc, argv);
  return 0;
}

原理说明

  • HEAPU32是Emscripten暴露的JS内存视图,对应C端的32位无符号整数内存区域,用来读取指针值(如果是64位架构,替换为HEAPU64即可)。
  • new Uint32Array(HEAPU32.buffer, argv, argc * 4)创建了一个指向argv起始地址的数组视图,长度为argc,每个元素占4字节(32位指针的大小)。
  • 遍历这个视图时,每个元素就是C端字符串的指针地址,再用UTF8ToString就能正确解析出对应的字符串内容。

额外提示

如果你的字符串是堆上动态分配的(比如用malloc),记得做好内存管理避免泄漏;如果是栈上字符串,要确保调用EM_JS函数时内存未被释放。

重新用emcc main.c -o main.html编译后,就能得到你期望的["ab", "cd", "ef", "gh"]输出了。

内容的提问来源于stack exchange,提问作者Zack Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:57:38