Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C free()函数在几个memmove';s_C_Arrays_Free_Memmove - Fatal编程技术网

C free()函数在几个memmove';s

C free()函数在几个memmove';s,c,arrays,free,memmove,C,Arrays,Free,Memmove,我正在编写一个类似js中的splice函数的函数:给定一个数组(任何类型),删除从给定索引开始的一些元素,并在间隙中填充一些新元素(如果需要,扩展或隐藏原始数组) 我正在Windows7下使用MinGw/EclipseCDT。这是我的密码: void* splice(int typesize,void* arr, int size,int start, int length, void* stuff,int size2){ //length is

我正在编写一个类似js中的
splice
函数的函数:给定一个数组(任何类型),删除从给定索引开始的一些元素,并在间隙中填充一些新元素(如果需要,扩展或隐藏原始数组)

我正在Windows7下使用MinGw/EclipseCDT。这是我的密码:

void* splice(int typesize,void* arr,
        int size,int start, int length,
            void* stuff,int size2){
    //length is the number of elements to remove
    //and size2 is the number of elements to fill in the gap

    //so size-gap will be the size of the new array after the function
    //when gap is a minus number, the array grows
    //and when gap is a positive number, the array shrinks
    int gap = length-size2;
    void* ptr = malloc(typesize*(size-gap));//--------(1)--------
    if(ptr==NULL){
        puts("error");
        return NULL;
    }
    //now the ptr array is empty, copy the original array(arr)
    //to the ptr until the 'start' index
    memmove(ptr,arr,typesize*start);

    //fill the new array 'stuff' into ptr starting from 
    //the index after 'start'
    memmove(ptr+typesize*start,stuff,typesize*size2);

    //and copy the rest of the original array (starting from 
    //the index start+length, which means starting from 'start' index
    //and skip 'length' elements) into ptr
    memmove(ptr+typesize*(start+size2),arr+typesize*(start+length),
            typesize*(size-start-length));

    return ptr;
}
我还编写了一些测试代码,下面的代码片段是针对
long
类型的:

int main(){
    setbuf(stdout,NULL);
    int start = 1;
    int delete = 6;
    long long* oldArray= malloc(sizeof(long long)*7);
    long long* stuff = malloc(sizeof(long long)*3);
    oldArray[0]=7LL;
    oldArray[1]=8LL;
    oldArray[2]=4LL;
    oldArray[3]=1LL;
    oldArray[4]=55LL;
    oldArray[5]=67LL;
    oldArray[6]=71LL;
    stuff[0]=111LL;
    stuff[1]=233LL;
    stuff[2]=377LL;
    int newsize = 7-(delete-3);
    void* newArray = splice(sizeof(long long),oldArray,7,start,delete,stuff,3);
    if(newArray){

        //------------crash happens here-----------
        //free(oldArray);
        //-------------

        oldArray =  newArray;
        int i=0;
        for(;i<newsize;i++){
            printf("%I64d\n",oldArray[i]);
        }
    }
    return 0;
}
intmain(){
setbuf(标准输出,空);
int start=1;
int delete=6;
long-long*oldArray=malloc(sizeof(long-long)*7);
long-long*stuff=malloc(sizeof(long)*3);
oldArray[0]=7LL;
oldArray[1]=8LL;
oldArray[2]=4LL;
oldArray[3]=1LL;
oldArray[4]=55LL;
oldArray[5]=67LL;
oldArray[6]=71LL;
stuff[0]=111LL;
材料[1]=233LL;
stuff[2]=377LL;
int newsize=7-(删除-3);
void*newArray=splice(sizeof(long-long),oldArray,7,start,delete,stuff,3);
if(newArray){
//------------这里发生车祸-----------
//免费(旧阵列);
//-------------
oldArray=newArray;
int i=0;
对于(;i请看这一行:

    memmove(ptr,arr,typesize*size);
它试图将typesize*大小字节移动到ptr。但您只分配了typesize*(size-gap)字节。如果gap>0,这将导致崩溃,除非您非常不走运

在发现第一个bug后,我停止了检查,因此可能会有更多bug,我也没有费心去找出代码的作用。您应该添加一条注释,说明函数应该做得足够好,这样我就可以实现它,而无需猜测或问您问题。

看这一行:

    memmove(ptr,arr,typesize*size);
它试图将typesize*大小字节移动到ptr。但您只分配了typesize*(size-gap)字节。如果gap>0,这将导致崩溃,除非您非常不走运

在发现第一个bug后,我停止了检查,因此可能会有更多bug,我也没有费心去找出代码的作用。您应该添加一条注释,说明函数应该做得足够好,这样我就可以实现它,而无需猜测或问您问题。

看这一行:

    memmove(ptr,arr,typesize*size);
它试图将typesize*大小字节移动到ptr。但您只分配了typesize*(size-gap)字节。如果gap>0,这将导致崩溃,除非您非常不走运

在发现第一个bug后,我停止了检查,因此可能会有更多bug,我也没有费心去找出代码的作用。您应该添加一条注释,说明函数应该做得足够好,这样我就可以实现它,而无需猜测或问您问题。

看这一行:

    memmove(ptr,arr,typesize*size);
它试图将typesize*大小字节移动到ptr。但您只分配了typesize*(size-gap)字节。如果gap>0,这将导致崩溃,除非您非常不走运


在发现第一个bug后,我停止了检查,因此可能会有更多的bug,我也没有费心去找出代码的作用。你应该添加一条注释,说明函数应该做得足够好,这样我就可以实现它,而不必猜测或问你问题。

如果你不能释放该块,它基本上会说它已损坏,因此你可以o超出数组边界。这个特定示例在哪里会导致崩溃?因为它对我来说很好,我看不出任何错误。如果它崩溃,请尝试一次注释一个
memove()
以查看哪个(如果有)是什么原因造成的。如果你不能释放该块,它基本上会说它已损坏,所以你要超越数组边界。这个特定的示例在哪里会导致崩溃?因为它对我来说工作正常,我看不出任何错误。如果它崩溃,请尝试一次注释一个
memove()
以查看哪个(如果有的话)是什么原因造成的。如果你不能释放该块,它基本上会说它已损坏,所以你要超越数组边界。这个特定的示例在哪里会导致崩溃?因为它对我来说工作正常,我看不出任何错误。如果它崩溃,请尝试一次注释一个
memove()
以查看哪个(如果有的话)是什么原因造成的。如果你不能释放该块,它基本上会说它已损坏,所以你要超越数组边界。这个特定的示例在哪里会导致崩溃?因为它对我来说工作正常,我看不出任何错误。如果它崩溃,请尝试一次注释一个
memove()
以查看哪个(如果有的话)是原因。谢谢,我编辑了我的帖子。事实上,间隔可以是负数。该函数的目的是修改数组:删除从索引开始的某个元素,然后将另一个数组的元素填充到间隔中。原始数组根据移除的元素数和填充的新元素数进行扩展或收缩。谢谢你,现在程序运行得很好。问题确实源于你发现的bug。谢谢,我编辑了我的帖子。事实上,间隙可以是负数。该函数的目的是修改数组:从索引中删除一些元素,然后将另一个数组的元素填充到间隙中。原始数组根据元素的数量进行扩展或收缩删除ENT并填充多少新元素。谢谢,现在程序运行良好。问题确实源于您发现的错误。谢谢,我编辑了我的帖子。事实上,间隔可以是负数。该函数旨在修改数组:删除从索引开始的某个元素,并将另一个数组的元素填充到间隔中。或原始数组的扩展或收缩取决于删除了多少元素以及填充了多少新元素。谢谢,现在程序运行良好。问题确实源于您发现的错误。谢谢,我编辑了我的帖子。事实上,间隔可以是负数。该函数的目的是修改数组:从中删除一些元素dex,并将另一个数组的元素填充到间隙中。原始数组根据移除的元素数和填充的新元素数进行扩展或收缩。谢谢,现在程序可以工作了