emscripten - string / char *参数引用怪异

时间:2014-03-25 15:06:40

标签: javascript c emscripten

所以我正在玩emscripten和制作链表。我在C -

中开始使用以下代码
struct Node {
  struct Node *next;
  char *value;
};

extern struct Node *ll_new_node(char *value) {
    struct Node *node;
    node = malloc(sizeof(struct Node));
    node->value = value;
    return node;
}

extern struct Node *ll_add(struct Node *root, char *value) {
  struct Node *node = ll_new_node(value);
  if (root == NULL) {
    root = node;
  } else {
    tail(root)->next = node;
  }
  return root;
}

//....

在页面中我以这种方式调用代码 -

var new_node = Module.cwrap('ll_new_node', 'object', ['string'])
var add = Module.cwrap('ll_add', 'object', ['object', 'string']);
var list = 0;
Zepto(function($){
  var printList = function() {
    var node = list;
    var s = "head -> ";
    while (node != null && node != 0) {
      s = s + value(node) + " -> ";
      node = next(node);
    }
    s = s + "NULL";
    $('#display').text(s);
  };
  printList();
  $('#addBtn').on('click', function() {
    var add_value = $('#itemField').val();
    if (add_value && add_value.length > 0) {
      list = add(list, add_value);
      printList();
    }
  });
  //...
});

发生了什么事,如果我把" A"在文本框中将其添加到列表中," head - > A - > NULL"会打印。如果我,但是" B"在文本框中将其添加到列表中," head - > B - > B - > NULL"会打印。随着更多节点的添加,相同的模式仍在继续。它正在添加新节点,但似乎所有node->value字段都指向共享字符串引用。

我在C中制作了一些测试代码来构建和打印一个列表,它按预期工作,没有任何变化。我最终通过使用strcpy对传递到ll_new_node的字符串并将副本分配给node->value来通过emscripten进行修复。

这是"预期的行为"还是一个bug?是"复制参考"由于我在JavaScript方面如何使用它的一些问题而导致字符串?有没有办法告诉Emscripten不要这样做?

0 个答案:

没有答案