将元素添加到 malloc 数组的中间
Adding an element to the middle of a malloc array
我创建了一个函数,允许从我的 malloc(ed) 数组(结构三角形坐标列表)中删除一个元素。那很好用。
但是当我尝试创建一个添加元素的元素(在位置 i 之后)时,它就不起作用了...
例如,如果我有一个数组 [0] [1] [2] [3] [4] [5] 并且想在 [3] 之后添加一个新值。
这是我的代码:(这是我的 while 循环中的一个片段)
totaltri++;
addtriangle(trilist, totaltri, i);
i++;
secondtriangle(p, &t1, &t2, &t3, v, i);
i++;
我的代码 deletetriangle(....):
for (int c = i; c < totaltri; c++)
{
trilist[c] = trilist[c+1];
}
tmp = (triangle *) realloc(trilist, (totaltri-1)*sizeof(triangle));
trilist = tmp;
还有我的代码 addtriangle(....):这似乎不起作用..!
tmp = (triangle *) realloc(trilist, (totaltri+1)*sizeof(triangle));
for (int c = totaltri; c > i; c--)
{
trilist[c-1] = trilist[c];
}
trilist = tmp;
然后我继续为刚刚添加到此代码中的第二个三角形赋值:
int p1, p2, p3;
p1 = whereisthepoint(p, *t1, v);
p2 = whereisthepoint(p, *t2, v);
p3 = whereisthepoint(p, *t3, v);
triptr=&(trilist[i]);
triptr->corner=(point *) malloc(3*sizeof(point));
pt1ptr=&(triptr->corner[0]);
pt2ptr=&(triptr->corner[1]);
pt3ptr=&(triptr->corner[2]);
pt3ptr->x=t3->x; etc etc
- 您必须将前一个元素的值赋给下一个元素。您的分配已撤消。
trilist
通过 realloc()
无效,因此您应该使用 tmp
进行移位。
- 您必须分配新值才能添加它。
malloc()
家族的选角结果是 considered as a bad practice。
addtriangle(....):
应该是这样的:
tmp = realloc(trilist, (totaltri+1)*sizeof(triangle));
for (int c = totaltri; c > i; c--)
{
tmp[c] = tmp[c-1]; /* correctly shift the elements */
}
tmp[i] = new_value; /* assign new value (replace new_value with proper thing) */
trilist = tmp;
假设您有一个类型为 T
的指针 p
声明为:T *p;
并且您还有一个要添加的对象声明为 T x;
然后就这样做:
T *p = malloc(sizeof *p * size);
T x;
...
// Reallocate to make room for one more element
T *tmp = realloc(p, sizeof *p * (size + 1));
// Error checking
if(!tmp) { /* Handle error */ }
p = tmp;
// Move the elements after the insertion spot
memmove(&p[index+1], &p[index], sizeof *p * (size - index));
// And insert
p[index] = x;
如果您不关心分配错误的恢复,则不需要临时变量。那么你可以这样做:
p = realloc(p, sizeof *p * (size + 1));
if(!p) exit(EXIT_FAILURE);
tmp = (triangle *) realloc(trilist, (totaltri+1)*sizeof(triangle));
for (int c = totaltri; c > i; c--)
{
trilist[c-1] = trilist[c];
在您的代码中修改(如果重新分配成功)无效指针。 trilist
可能未指向有效的内存位置。您应该改用 tmp
或将 trilist
分配给 tmp
.
添加到数组的通用函数。
void *addToArr(void *array, size_t arraysize, size_t pos, size_t elemsize, void *element)
{
unsigned char *ucarray;
array = realloc(array, (arraysize + 1) * elemsize);
if(array)
{
ucarray = array;
memmove(ucarray + (pos + 1) * elemsize, ucarray + pos * elemsize, (arraysize - pos) * elemsize);
memcpy(ucarray + pos * elemsize, element, elemsize);
}
return array;
}
我创建了一个函数,允许从我的 malloc(ed) 数组(结构三角形坐标列表)中删除一个元素。那很好用。 但是当我尝试创建一个添加元素的元素(在位置 i 之后)时,它就不起作用了...
例如,如果我有一个数组 [0] [1] [2] [3] [4] [5] 并且想在 [3] 之后添加一个新值。
这是我的代码:(这是我的 while 循环中的一个片段)
totaltri++;
addtriangle(trilist, totaltri, i);
i++;
secondtriangle(p, &t1, &t2, &t3, v, i);
i++;
我的代码 deletetriangle(....):
for (int c = i; c < totaltri; c++)
{
trilist[c] = trilist[c+1];
}
tmp = (triangle *) realloc(trilist, (totaltri-1)*sizeof(triangle));
trilist = tmp;
还有我的代码 addtriangle(....):这似乎不起作用..!
tmp = (triangle *) realloc(trilist, (totaltri+1)*sizeof(triangle));
for (int c = totaltri; c > i; c--)
{
trilist[c-1] = trilist[c];
}
trilist = tmp;
然后我继续为刚刚添加到此代码中的第二个三角形赋值:
int p1, p2, p3;
p1 = whereisthepoint(p, *t1, v);
p2 = whereisthepoint(p, *t2, v);
p3 = whereisthepoint(p, *t3, v);
triptr=&(trilist[i]);
triptr->corner=(point *) malloc(3*sizeof(point));
pt1ptr=&(triptr->corner[0]);
pt2ptr=&(triptr->corner[1]);
pt3ptr=&(triptr->corner[2]);
pt3ptr->x=t3->x; etc etc
- 您必须将前一个元素的值赋给下一个元素。您的分配已撤消。
trilist
通过realloc()
无效,因此您应该使用tmp
进行移位。- 您必须分配新值才能添加它。
malloc()
家族的选角结果是 considered as a bad practice。
addtriangle(....):
应该是这样的:
tmp = realloc(trilist, (totaltri+1)*sizeof(triangle));
for (int c = totaltri; c > i; c--)
{
tmp[c] = tmp[c-1]; /* correctly shift the elements */
}
tmp[i] = new_value; /* assign new value (replace new_value with proper thing) */
trilist = tmp;
假设您有一个类型为 T
的指针 p
声明为:T *p;
并且您还有一个要添加的对象声明为 T x;
然后就这样做:
T *p = malloc(sizeof *p * size);
T x;
...
// Reallocate to make room for one more element
T *tmp = realloc(p, sizeof *p * (size + 1));
// Error checking
if(!tmp) { /* Handle error */ }
p = tmp;
// Move the elements after the insertion spot
memmove(&p[index+1], &p[index], sizeof *p * (size - index));
// And insert
p[index] = x;
如果您不关心分配错误的恢复,则不需要临时变量。那么你可以这样做:
p = realloc(p, sizeof *p * (size + 1));
if(!p) exit(EXIT_FAILURE);
tmp = (triangle *) realloc(trilist, (totaltri+1)*sizeof(triangle));
for (int c = totaltri; c > i; c--)
{
trilist[c-1] = trilist[c];
在您的代码中修改(如果重新分配成功)无效指针。 trilist
可能未指向有效的内存位置。您应该改用 tmp
或将 trilist
分配给 tmp
.
添加到数组的通用函数。
void *addToArr(void *array, size_t arraysize, size_t pos, size_t elemsize, void *element)
{
unsigned char *ucarray;
array = realloc(array, (arraysize + 1) * elemsize);
if(array)
{
ucarray = array;
memmove(ucarray + (pos + 1) * elemsize, ucarray + pos * elemsize, (arraysize - pos) * elemsize);
memcpy(ucarray + pos * elemsize, element, elemsize);
}
return array;
}