【问题标题】:realloc and pointer to integer comparison issues in c structures and functionsrealloc 和指向 c 结构和函数中的整数比较问题的指针
【发布时间】:2014-11-12 21:34:44
【问题描述】:
typedef struct 
{
    int* data;
    unsigned int len;
}intarr_t;

intarr_result_t intarr_push( intarr_t* ia, int val )
{
    intarr_t* tmp;
    // Warning too few arguments to function ‘realloc’
    tmp = realloc(intarr_t, (ia-> len+1)*sizeof *intarr_t); // problem here..
    ia = tmp;
    ia->data[ia->len+1] = val;
    for (eye = 0; eye < 30; eye++)
    { 
            // Warning passing argument 1 ointarr.c:140:17: error: expected expression before ‘intarr_t’
   tmp = realloc(intarr_t, (ia->len+1)*sizeof(intarr_t));f ‘free’ makes pointer from 
                //integer without a cast
                free(tmp->data[eye]);
                free(tmp);
    } 
}

我目前尝试编写一个程序来将一个值附加到传递给我的数组上,但无论我做什么,这些小问题似乎都会发生。有人可以向我解释这里的根本问题以及如何解决它吗?

我已经尝试了大家的建议,但是我得到了这个错误:

intarr.c:140:17: error: expected expression before ‘intarr_t’
   tmp = realloc(intarr_t, (ia->len+1)*sizeof(intarr_t));
                 ^
intarr.c:140:17: error: too few arguments to function ‘realloc’

【问题讨论】:

  • 给定这一行: tmp = realloc(intarr_t, (ia-> len+1)*sizeof *intarr_t); realloc 的第一个参数是指针变量,而不是结构类型。这部分: sizeof *intarr_t 将始终为 4(指针的大小)另外,需要检查生成的 tmp 变量以确保 realloc 成功tmp 不包含 NULL
  • 这一行: intarr_result_t intarr_push( intarr_t* ia, int val ) 1) intarr_result_t 未在提供的代码中定义。然而真正的问题是代码应该返回一个完整的 intarr_result_t。这很少是一个好主意。返回指向 intarr_result_t 实例(不在堆栈上)的指针会更好

标签: c pointers memory-management casting warnings


【解决方案1】:

或许,应该在下面。

intarr_result_t intarr_push(intarr_t* ia, int val )
{
    int *tmp;
    tmp = realloc(ia->data, (ia->len+1)* sizeof *ia->data);
    if(tmp)
        ia->data = tmp;
    else {
        free(ia->data);
        exit(-1);//or return something;
    }
    ia->data[ia->len++] = val;//update len
    return something;
}

【讨论】:

  • 抱歉回复晚了,我会试试你的实现,但我担心它会给我在底部问题中发布的相同错误。
  • 这个绝对值得一试,我认为它解决了问题。
  • 我有点惊讶你的实现几乎和我的一样,但代码更少。谢谢!
  • 确实,我已经尝试过针对我的,现在我正在尝试比较它,看看他做了什么反对我的错误语法。
  • 有人可以向我解释一下参数在 realloc 调用中的含义吗? tmp = realloc(ia->data, (ia->len+1)* sizeof *ia->data);
【解决方案2】:

tmp = realloc(intarr_t, (ia-&gt; len+1)*sizeof *intarr_t); // problem here

改为:

tmp = realloc(ia-&gt;data, ((ia-&gt;len)+1)*sizeof *intarr_t); // problem here

reallok 有两个参数,地址和新长度

不能保证正确答案,这只是我看到的第一件事

对不起,我的第一个答案不正确

【讨论】:

  • 是的,我在尝试后意识到,但我已经尝试了我们下面的那个,我收到了这个警告,我已经更新了我的帖子。
【解决方案3】:
tmp = realloc(intarr_t, (ia->len+1)*sizeof *intarr_t); // problem here..

应该是

tmp = realloc(ia->data, (ia->len+1)*sizeof(intarr_t));

free(tmp->data[eye]);

应该是

free(&(tmp->data[eye]));

因为你需要获取你正在释放的内存的地址。

【讨论】:

  • 你的建议和我上面的那个我收到了这个错误:
  • intarr.c:140:17: 错误:'intarr_t' tmp = realloc(intarr_t, (ia->len+1)*sizeof(intarr_t)) 之前的预期表达式; ^ intarr.c:140:17: 错误:函数“realloc”的参数太少
猜你喜欢
  • 2019-08-27
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
相关资源
最近更新 更多