我实现了一个C计算器来分析输入。 我有一个结构体(如链表),但是在macOS上,我必须通过init_null函数或值类似的变量进行初始化。 我只有一个问题:为什么?
在Linux上,没有问题。
typedef struct node_t {
int value;
char operator;
struct node_t *left;
struct node_t *right;
} node_t;
node_t *init_null(node_t *root) {
root->value = NULL;
root->operator = NULL;
root->left = NULL;
root->right = NULL;
return root;
}
node_t *build_tree(const char *argv[], int *position) {
node_t *new = malloc(sizeof(node_t));
new = init_null(new); /*sinon erreur*/
if (isdigit(*argv[*position])) {
new->value = atoi(argv[*position]);
} else/*Opérateur*/ {
new->operator = *argv[*position];
*position = *position + 1;
new->left = build_tree(argv, position);
*position = *position + 1;
new->right = build_tree(argv, position);
}
return new;
}
运行时,./main * 2 + 3 4
应打印(2 * (3 + 4))
。
答案 0 :(得分:2)
问题出在这里
您可以使用至少两种内存分配方法,malloc
和calloc
。区别在于malloc
不会初始化(或设置)成功分配的内存给任何东西。如@EricPostpischil所述,在这种编译状态下,对编译器特定的内存块有不确定的显式或隐式影响。
calloc
将成功分配的内存块设置为零。请注意,参数略有不同。
回到您的关注点,在Linux malloc
中,刚好分配了一块内存为零的内存块,而在macos平台上却有东西。
如果需要,请使用calloc
,否则对分配的内存块执行memset
为0的操作。
答案 1 :(得分:0)
因此,我应该在具有内存集的malloc之后或仅通过使用calloc而不是malloc来初始化build_tree中的变量?