【问题标题】:C Language - Type assignment from incompatible pointer type [enabled by default]C 语言 - 来自不兼容指针类型的类型分配 [默认启用]
【发布时间】:2015-03-09 08:54:20
【问题描述】:

这个指针列表有问题:

struct list{
    int x;
    int y;
    struct list *next_ptr;
};

我有这个函数每次都会崩溃,原因可能是这种类型分配失败。

boolean funzione_esame(struct list **ptrptr, int *number){
    if(*ptrptr != NULL){
    struct list *tmp;
    struct list *pos;
    pos=(struct list *)malloc(sizeof(struct list));
    pos=&((*ptrptr)->next_ptr);
    *number=1;
    while(pos != NULL){
        if(pos->x <= (*ptrptr)->y){
            pos->x=(*ptrptr)->y;
            if(pos->x >= pos->y){
                tmp=pos;
                pos=&(pos->next_ptr);
                free(tmp);
                continue;
            }
        }
        pos=&(pos->next_ptr);
        ptrptr=&((*ptrptr)->next_ptr);
        *number=*number + 1;
        }
    return TRUE;
    } else return FALSE;
}

警告在这行:

  • pos=&amp;((*ptrptr)-&gt;next_ptr);
  • pos=&amp;(pos-&gt;next_ptr);

我不知道我做错了什么,因为指针类型总是相同的 (struct list)。 提前感谢您的帮助。

【问题讨论】:

  • 嗯,你介意格式化一下你的代码吗?
  • 任何时候你有ptrvar = allocation_func(...); 紧跟ptrvar = something else; 在你的代码中放置一个巨大的红旗,因为在最好你只是编写了一个大胆的内存泄漏。并且这两个警告都是正确的(如果你正在编译,应该是错误的)。类型不匹配。最后,你的代码应该做什么?
  • 你的pos变量和next_ptr是同类型的,是struct list*,赋值pos时不需要& ->next_ptrpos。请格式化您的代码,可能会出现更多问题,并且没有人会深入研究您格式化错误的代码。

标签: c pointers struct variable-assignment


【解决方案1】:

问题的原因 [来自不兼容指针类型的类型分配] 是

pos=&((*ptrptr)->next_ptr);

改成

pos= (*ptrptr)->next_ptr;

posstruct list *(*ptrptr)-&gt;next_ptr 也是。

pos=&amp;(pos-&gt;next_ptr); 也一样,改为pos= pos-&gt;next_ptr;

另外,前面的malloc() 不是必需的。您立即将其他一些指针分配给pos,因此之前分配的内存没有被使用,也不是freed,造成内存泄漏。

【讨论】:

  • 这些是您收到警告的行。警告 - 有一个原因。由于历史原因,C 有点准备好让你一脚踢飞了。
  • 谢谢现在它工作了^^ 仍然它似乎是另一个问题。该函数应转换此列表(其中列表格式为 (x,y): (1,2), (3,6), (4,8), (5,7), (6,9)这个:(1,2), (3,6), (6,8), (8,9) 直到 (6,8) 它工作但是当第二个 if 登录时 ( if(pos->x >= pos -> y) ) 它不能正常工作。因为当我标记最终列表时,最后一个元素是 (3615464,3615312) 而不是 (8,9)。函数中一定有错误,但我想不通出来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
相关资源
最近更新 更多