c - 我做错了什么 - C 指针

标签 c pointers memory-management runtime-error dynamic-memory-allocation

<分区>

我已经定义了 struct Node 和 createNode 函数。

typedef struct {
    int r, c;
    int val;
    struct Node* down, *right;
} Node;

typedef Node* NodePointer;    

NodePointer createNode(int r,int c,int val) {
        NodePointer p = (NodePointer)malloc(sizeof(NodePointer));
        if (p != NULL) {
            p->r = r;
            p->c = c;
            p->val = val;
            p->down = p->right = NULL;
        }
        return p;
}

然后当我尝试在主函数中使用它时

int i = 0;
NodePointer* rows = (NodePointer*)malloc(50*sizeof(NodePointer));
for (i = 0; i < 20; i++) {        
    rows[i] = createNode(i,i+10,i*i);
}

它抛出运行时错误,但是当我像这样更改 for 循环时(更改在 for 循环中 - 只执行一次):

for (i = 0; i < 1; i++) {        
    rows[i] = createNode(i,i+10,i*i);
}

它没有抛出错误。所以我问我做错了什么; 错误:

Zad1: malloc.c:2374: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 *(sizeof(size_t))) - 1)) & ~((2 *(sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long) old_end & pagemask) == 0)' failed.

最佳答案

改变这个:

NodePointer p = (NodePointer)malloc(sizeof(NodePointer));

为此:

Node p = malloc(sizeof(Node));

因为您要分配类型为 Node 的元素,而不是 NodePointer

提示:强制转换 malloc() 的返回值不会导致错误,但您不应该这样做,如 Do I cast the result of malloc? 中所述。

PS:当你为prows分配相同的类型时,是不是觉得很奇怪? ;)

关于c - 我做错了什么 - C 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55079723/

相关文章:

c++ - 快速调整 mmap 文件的大小

android - 对 NDK 中的不同库使用 ndk-build 和 cmake

c++ - 指针和引用问题(链表)

pointers - 当 Vec 被 move 时,我可以(不安全地)持有一个指向 Vec 元素的指针吗?

iphone - UITabBarController 在内存警告后释放 View

c# - 动态编译代码时出现IOException

objective-c - 哈希表中的 ARC 弱引用

c - 读取特定的输入并以相同的格式打印它

c - yacc文件解析

c++ - "smart pointer to member"的真实示例是什么?