我实现了一个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))
。
问题如下:
至少有两种内存分配方法可以使用,malloc
和calloc
。不同之处在于malloc
不会将成功分配的内存初始化(或设置(为任何内容。正如@EricPostpischill所解释的,内存块上有一个不确定的显式或隐式影响,这是在这种编译状态下编译器特有的。
而CCD_ 6将成功分配的存储器块设置为零。请注意,这些论点略有不同。
回到您的担忧,在Linux中,malloc
只是碰巧分配了一块内存,而在macos平台上,内存中有一些东西。
如果需要,请使用calloc
,否则对分配的内存块执行0的memset
。