繁体   English   中英

malloc(sizeof(struct Node))与malloc(sizeof(nodeptr))的不同行为

[英]Different behaviour for malloc(sizeof(struct Node)) vs malloc(sizeof(nodeptr))

我试图使用malloc分配内存,但我无法理解为什么我为这两个malloc调用得到不同的结果。

即使使用gdb,下面的行也给我错误的结果,即使我看到数据正在分配正确的值。

  • nodeptr n = malloc(sizeof(nodeptr));

    值头->数据:“!”
    值的head-> eq-> data:''

当我这样做时,将得到正确的结果:

  • nodeptr n = malloc(sizeof(结构节点));

    值头->数据:“ w”
    值头-> eq-> data:'X'

我关注了这篇文章,我认为我做得正确。
在两种方式下,虽然分配时我得到的内存量相同,但最终却看到了不同的结果。

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);
}

两种不同的版本没有分配相同数量的内存。 sizeof(nodeptr)是一个指针和大小sizeof(struct Node)是你的结构的大小。 这些东西不一样,大小也不一样。 在我的计算机上,这些值为832

您要使用:

nodeptr n = malloc(sizeof(struct Node));

也许:

nodeptr n = malloc(sizeof(*n)); // size of the type that n points too

sizeof(nodeptr) == sizeof(struct Node*) != sizeof(struct Node) == sizeof(*nodeptr)

  • sizeof(nodeptr)始终是指针的大小(例如64位CPU上的8个字节)
  • sizeof(struct Node)引用结构内容
  • sizeof(*nodeptr)等同于sizeof(struct Node)其中包含额外的解除引用运算符。

它看起来“起作用”(不是segfault)的原因是malloc从更大的堆内存块中进行子分配。 但是,代码正在写超出所请求分配的界限,这最终可能在某些时候导致堆损坏或段错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM