使用 realloc() 进行无效插入

void insertion with realloc()

我正在尝试执行 void insertion(),但总是出现分段错误,请参阅下文。同时,我引用了这个 link.

首先,我做了realloc(),然后将每个内存移动到position之后的下一个space,最后将insertion放在position中并增加 nArraySize.

#include <stdio.h>
#include <stdlib.h>

void printArray(double array[], unsigned int size)
{
  for (unsigned int i = 0; i < size; ++i) 
  {
    printf("%.3f  ", array[i]);
  }
  printf("\n");
}

void insert(double **array,
            size_t *nArraySize,
            double insertion,
            unsigned int position)
{
  //realloc the memory space first
  *array = realloc(*array, (*nArraySize+1) * sizeof(double));

  for(unsigned int i = nArraySize[0]-1; i >= position; i--)
  {
     *array[i+1] = *array[i];
  }

  *array[position] = insertion;

  *nArraySize += 1;

}

int main()
{
  double *t = calloc(4, sizeof(double));

  t[0] = 0; 
  t[1] = 1; 
  t[2] = 2; 
  t[3] = 3;

  size_t k = 4;

  insert(&t, &k, 1, 1);

  printf("k is %zu\n", k);
  printArray(t, k);
  free(t);
}

请帮忙。欢迎任何建议。

由于运算符的优先级,这些陈述是不正确的。

*array[i+1] = *array[i];
*array[position] = insertion;

即后缀运算符的优先级高于一元运算符。

你必须写任何一个

( *array )[i+1] = ( *array )[i];
( *array )[position] = insertion;

或者像您已经在做的那样

array[0][i+1] = array[0][i];
array[0][position] = insertion;

注意你的函数insert是不安全的,因为没有检查position的值是否小于或等于传入数组中的当前元素数。

还有这个for循环

for(unsigned int i = nArraySize[0]-1; i >= position; i--)
{
   ( *array )[i+1] = ( *array )[i];
}

可以调用未定义的行为。首先,变量 i 总是有一个 non-negative 数字。也就是说 i 的值不能为负,因为变量 i 的类型是 unsigned int。现在假设 *nArraySize 等于 1 并且 position 等于 0;在这种情况下,您有循环

for(unsigned int i = 0; i >= 0; i--)
{
   ( *array )[i+1] = ( *array )[i];
}

并且在循环的第一次迭代之后 i 的值将非常大,大于 0

所以循环改写成下面这样会更好

for(unsigned int i = *nArraySize; i > position; i--)
{
   ( *array )[i] = ( *array )[i-1];
}