仅使用指针的链表 question+problem

linked list using only pointers question+problem

提问人:Alex Babushin 提问时间:12/7/2022 最后编辑:Alex Babushin 更新时间:12/7/2022 访问量:32

问:

我遇到了烦人的问题,我不太明白, 我有int *类型的指针 示例代码:


int* p_Memory_blocks;

int MemoryInit(int num_of_blocks, int block_size) {

    int* head;
    head = NULL;

    for (int i = 0; i < num_of_blocks; i++) {
        
        if ((head = malloc(block_size)) == NULL) {
            printf("allocating memory failed");
            for (int j = 0; j < i; j++) {
                p_Memory_blocks = head;
                head = *head;
                free(p_Memory_blocks);
            }
            return 1;
        }
        head = &p_Memory_blocks;
        p_Memory_blocks = head;
    }
    return 0;
}

int* MyMalloc() {
    int* return_block = p_Memory_blocks;
    p_Memory_blocks = *p_Memory_blocks;
    return return_block;
}
void MyFree(int* block) {
    *block = p_Memory_blocks;
    p_Memory_blocks = block;
}



这是初始化内存池的代码,试图以某种方式将指针连接到链接的指针

基本上我使用指针来构建链接指针

(我的任务是构建一个固定的块内存池分配器,我只能以字节为单位对 block_size * block_amount的总量进行 malloc,并且我不能再对任何管理器使用任何 malloc,我唯一拥有的是一个 int * 类型的全局变量,所以我想构建一个链接指针并将头部返回给用户,然后将其推进到下一个指针)

从理论上讲,p_Memory_blocks应该前进到最后一个值,因为像链表一样,他目前是负责人,但我得到“抛出未处理的异常:读取访问冲突”等 如果使用两次后失败 p_Memory_blocks = *p_Memory_blocks; ,所以有人得到解释吗?还是更好的实现方式?

谢谢!

我试图malloc更多的内存和变量类型

c 指针 内存管理 malloc

评论

0赞 ikegami 12/7/2022
链表节点有两个字段:next 和 value。你不会只用一个领域走得太远。除非你解决这个问题,否则你注定要失败
0赞 Bodo 12/7/2022
您的代码不完整。请编辑您的问题并复制并粘贴一个最小的可重现示例。尝试使用指针不是链表的正确实现。由于分配了不兼容的类型,您应该会收到来自编译器的警告。修复所有错误和警告。如果您不知道如何修复它们,请复制并粘贴完整的错误或警告消息并要求
0赞 picchiolu 12/7/2022
不确定任何 *nx = n(x+1) 赋值是否正确。此外,在 printf 中,您尝试打印指针指向的内存位置,而不是其值...你到底想实现什么?您能举例说明您期望的输出吗?
0赞 Alex Babushin 12/7/2022
除了int *类型的全局变量之外,我不允许使用任何其他变量,这意味着我不能使用节点来做链表,我试图实现某种链接指针,但我遇到了这个问题,我不明白为什么它不可能做
0赞 picchiolu 12/7/2022
@AlexBabushin:您的代码存在许多问题。看来您滥用了指针。

答:

0赞 ikegami 12/7/2022 #1

链表节点有两个字段:next 和 value。你不会只用一个领域走得太远。除非你解决这个问题,否则你注定要失败。


你眼前的问题源于此。

在循环中,有时包含指向下一个节点的指针,有时包含值,您无法区分两者。n1

从技术上讲,最终会成立,此时会导致未定义的行为。n1100*n1

您需要先解决结构未包含足够信息的问题,然后才能继续。

评论

0赞 Alex Babushin 12/7/2022
我用更多的代码细节更新了问题,似乎我不清楚
0赞 ikegami 12/7/2022
不,很清楚。你现在发布的内容,otoh,并不能证明问题所在。但这仍然是同样的问题。必须运行