所以我正在玩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不要这样做?