C中奇怪的内存问题

时间:2014-12-17 09:58:02

标签: c arrays memory

我在C中遇到了一个非常奇怪的问题。

这是我的功能:

void array_insert_range(void* dest[], const void* source[], unsigned int index, size_t length_dest, const size_t length_source)
{
    dest = (void**)realloc(dest, (length_dest+length_source) * sizeof(void*));
    for(unsigned int j = 0; j < length_source; j++)
    {
        for(unsigned int i = length_dest+length_source-1; i >= index; i--)
        {
            dest[i+1] = dest[i];
        }
    }
    for(unsigned int i = index; i<index+length_source; i++)
    {
       dest[i] = source[i-index];
    }
}

以下是我为它写的一些测试用例:

int* arr = array_create(7, sizeof(int));
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;
arr[5] = 6;
arr[6] = 7;
int* arr2 = array_create(4, sizeof(int));
arr2[0] = 1;
arr2[1] = 2;
arr2[2] = 3;
arr2[3] = 4;
array_insert_range(arr, arr2, 3, 7, 4);

这应该导致 arr 是一个包含元素 {1,2>,1,2,3,4,5,5,7}

我正在使用Code :: Blocks 13.12与GCC 4.8.1和GDB 7.6.1。当我使用调试器运行我的项目时,代码工作得很好。但是,如果我只是编译并正常运行,则数组包含一些奇怪的值,例如 {9472560,7988328,3,4,5,6,7,-1,888981658,134220576,9443152}

我尝试在程序的不同点打印值,似乎 array_insert_range 方法结束时数组 dest 很好,只有奇数值出现在测试用例方法中。

我很感激这个问题的任何帮助。

1 个答案:

答案 0 :(得分:0)

函数array_insert_range将指针作为第一个和第二个参数作为void的指针:在参数声明中,void* dest[]等同于void** dest。当您在测试用例中调用此函数时,您的编译器必须抱怨它。

所以正确的做法是使用地址array_insert_range拨打arr1

array_insert_range(&arr1, arr2, 3, 7, 4);

此外,您需要更改此函数的声明才能获取arr1的地址:

void array_insert_range(void** dest[], const void* source[], unsigned int index, size_t length_dest, const size_t length_source);

然后,在函数的代码中,使用*dest而不是dest