在c中复制数组的一部分时出现分段错误

时间:2014-11-28 20:37:03

标签: c arrays segmentation-fault copying

我在这里有一个函数,它将数组的一部分(从头到尾)复制到一个新数组。当我运行代码时,我最终得到了seg错误。我知道当我没有为数组分配足够的空间或者当我尝试访问尚未分配的内存时,会发生seg故障。但是对于我的len,我已经将它设置为last-first + 1,这应该足以包含我想要复制的数组部分。但为什么它仍然给我seg错误?或者我错过了什么?

以下是我完成的代码的结构:

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

这里是将数组部分复制到新数组的功能:

intarr_t* intarr_copy_subarray( intarr_t* ia, 
                unsigned int first, 
                unsigned int last )
{
    unsigned int len = last-first+1;
    intarr_t* newia = malloc(sizeof(intarr_t));
    assert (newia);
    newia->data = malloc(sizeof(int)*len);
    assert (newia->data);
    newia->len = len;
    if (newia == 0 || ia == NULL || last < first)
    { 
        return NULL;
    }
    else
    {
        for (int x = first; x <= last; x++)
        {
            memcpy (newia->data[x], ia->data[x], (len*sizeof(int)));
        }
        return newia;
    }
    free (newia);
    return 0;
}

2 个答案:

答案 0 :(得分:1)

更改这些陈述

    for (int x = first; x <= last; x++)
    {
        memcpy (newia->data[x], ia->data[x], (len*sizeof(int)));
    }

memcpy ( newia->data, ia->data + first, len * sizeof( int ) );

    for ( unsigned int i = 0; i < len; i++ )
    {
        newia->data[i] = ia->data[i + first];
    }

也是这种情况

if (newia == 0 || ia == NULL || last < first)
{ 
    return NULL;
}

是错误的。如果ia等于NULL或者最后一个,则必须在此块中释放已分配的内存。第一

在分配内存之前,您应该检查这些条件。

答案 1 :(得分:1)

这是你在for循环中使用的memcpy语句的问题。请注意,当您提供newia-&gt; data [x]时,它将转换为该特定指针处的整数值。

所以例如数据指向一个整数变量,其值如newia-&gt; data [x] = 2,第二个指向另一个整数变量ia&gt; data [x] = 3然后你的memcpy变为

memcpy(2,3,len * sizeof(int));

因此,您有效地将数据从地址3复制到地址2,而这两个数据都不是由您分配的。

你需要按照Vlad从莫斯科建议的方式行事。