我试图使用malloc分配内存,但我不明白为什么这两个malloc调用会得到不同的结果。
即使使用gdb,我也看到以下行给我错误的结果 数据正在分配正确的值。
nodeptr n = malloc(sizeof(nodeptr));
值头->数据:“!”
值head-> eq-> data:''
当我这样做时,将得到正确的结果:
nodeptr n = malloc(sizeof(结构节点));
值头->数据:“ w”
值的head-> eq-> data:'X'
我关注了this帖子,我认为我做得正确。
在两种方式下,分配时我得到的内存量相同,但最后却看到了不同的结果。
typedef struct Node
{
struct Node *left, *right, *eq;
char data;
bool isEnd;
} *nodeptr;
nodeptr newNode(const char c) {
nodeptr n = malloc(sizeof(nodeptr));
// nodeptr n = malloc(sizeof(struct Node));
n->data = c;
n->left = NULL;
n->right = NULL;
n->left = NULL;
n->isEnd = false;
return n;
}
void insert(nodeptr *node, const char *str) {
if (*node == NULL) {
*node = newNode(*str);
}
nodeptr pCrawl = *node;
if(pCrawl->data < *str) {
insert(&pCrawl->right, str);
} else if (pCrawl->data > *str) {
insert(&pCrawl->left, str);
} else {
if(*(str+1)) {
insert(&pCrawl->eq, str + 1);
} else {
pCrawl->isEnd = true;
}
}
}
int main(int argc, char const *argv[])
{
const char* const strs[5]= {
"w.",
};
nodeptr head = NULL;
for(int i = 0; i<1; i++) {
insert(&head, strs[i]);
}
return 0;
printf("Value head->data: \'%c\'\n", head->data);
printf("Value head->eq->data: \'%c\'\n", head->eq->data);
}
答案 0 :(得分:3)
两个不同的版本没有分配相同的内存量。 sizeof(nodeptr)
是指针的大小,sizeof(struct Node)
是您的结构的大小。这些东西不一样,大小也不一样。在我的计算机上,这些值为 8 和 32 。
您要使用:
nodeptr n = malloc(sizeof(struct Node));
或者也许:
nodeptr n = malloc(sizeof(*n)); // size of the type that n points too
答案 1 :(得分:3)
sizeof(nodeptr)
== sizeof(struct Node*)
!= sizeof(struct Node)
== sizeof(*nodeptr)
sizeof(nodeptr)
始终是指针的大小(例如64位CPU上的8个字节)sizeof(struct Node)
是指结构内容sizeof(*nodeptr)
等同于sizeof(struct Node)
,其中包含额外的取消引用运算符。它似乎“起作用”(而不是段错误)的原因是malloc
从更大的堆内存块中进行子分配。但是,代码正在超出请求的分配范围写,最终可能会在某些时候导致堆损坏或段错误。