调整数组大小(c)

时间:2015-04-03 23:46:34

标签: c arrays struct

我尝试调整数组大小以包含长度为" newlen"的值。如果newlen小于原始数组长度,则丢弃数组的末尾。如果newlen更大,则新整数应为零。我想出了这个功能,但是当我测试它时,我得到了分段错误。我也不知道如何将零添加到最后,我如何跟踪索引以便我可以在结尾添加零?我做了第一个案例(newlen小于len),但不知道如何处理另一个案例。

这是阵列的结构:

typedef struct {
  int* data;
  unsigned int len;
} intarr_t;

我的功能:

array_size( intarr_t* p, unsigned int newlength )

{

  int i,m = 0;

  if (newlength < len) 
        int *tmp;
    tmp = realloc(p->data, (p->newlen)* sizeof *p->data);
    if(tmp)

  {
    for (i; newlength < p->len; i++)
        {  for (m; newlength < p->len; m++)

    {
        p->data[i] = p->data[m];
    }
        }

  }

}

2 个答案:

答案 0 :(得分:1)

由于你没有在任何地方初始化我之前在循环中使用它可能是因为它。

还有代码

for (m; newlength < p->len; m++)

你在哪里为for循环的第二次和其他传递初始化这个值。同时两个循环都是无限循环。

要实现第二种情况,您可以执行类似的操作

if(newlength > p->len)
{
    int old_length = p->len;
    p = realloc(p->data, newlength * sizeof(p->data));
    if(p)
        memset(p + old_length,0,(newlength - old_length) * sizeof(p->data));
}

您的整个工作职能将如下

array_size( intarr_t* p, unsigned int newlength ) {
    intarr_t * tmp;
    if(newlength < p->len) {
        tmp = realloc(p->data, newlength * sizeof(p->data)); //realloc will automatically discard elements after new length
        if(tmp) {
            p = tmp;
            p->len = newlength;
        }
    }
    else if(newlength > p->len)
    {
        int old_length = p->len;
        tmp = realloc(p->data, newlength * sizeof(p->data));
        if(tmp){
            p = tmp;
            p->len = newlength;
            memset(p + old_length,0,(newlength - old_length) * sizeof(p->data));//for setting trailing element to 0
        }   
    }
}

答案 1 :(得分:1)

提供给realloc()p->data)的指针不会更改。

realloc()的使用通常需要像这样

tmp = realloc(old_pointer, new_number * sizeof(*tmp));
if (tmp == NULL)
{
      /*   an error occur and old_pointer remains unchanged */
      /*   need to recover */
}
else
{
     old_pointer = tmp;
     length = new_number;
}

我假设tmpold_pointer与上述类型相同。

然后你可以初始化old_pointer的其他元素(假设数组大小正在增加)。