我在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 很好,只有奇数值出现在测试用例方法中。
我很感激这个问题的任何帮助。
答案 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
。