使用 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];
}
我正在尝试执行 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];
}