我正在尝试分配一块内存,并存储一个结构列表而不为每个使用多个malloc ...这只是一个通用示例,我没有我之前使用的原始代码,但是这是一般的想法,但我的问题是,当我的代码的其他部分在InitPoints()函数调用之后执行时,我正在获得堆损坏。我不知道我的代码的哪一部分是非法的,但我怀疑它是在InitPoints()函数的for循环中。我试图将它用作表,然后我可以创建额外的定义大小的表,如果我的内存不足并将它们链接在一起......所以有点像动态扩展数组,如果这是有道理的。
typedef struct Tb{
POINT points;
POINT *next;
} TABLE;
typedef struct Pt{
int x;
int y;
}POINT;
POINT *mypoints;
int main() {
int size = 10;
int i = 0;
mypoints = InitPoints(size);
for(i=0; i < size; i++)
{
printf("mypoint [%d] = (%d,%d)\n",i, mypoints->x, mypoints->y);
mypoints = mypoints + sizeof(POINT);
}
// some other code...
// i.e. createThread(....)
return 0;
}
POINT* InitPoints(int size)
{
POINT *tmp;
POINT *orig;
int a = 10;
int b = 1000;
orig = (POINT*) malloc (sizeof(POINT) * size);
if(orig == NULL)
return NULL;
tmp = orig;
for (i = 0; i < size; i++)
{
tmp->x = a++;
tmp->y = b++;
tmp = tmp + sizeof(POINT);
}
return orig;
}
答案 0 :(得分:3)
问题出在这一行:
tmp = tmp + sizeof(POINT);
应该是
++tmp;
后者说要将指针递增一个元素;因为它指向结构,它增加了结构的大小。原始代码由 n 元素递增,其中 n 是结构中的字节数。例如,如果int是32位,则它将提前8个元素。
答案 1 :(得分:3)
这是错误的:
mypoints = mypoints + sizeof(POINT);
您应该在C中查看指针算术。只需使用:
mypoints += 1; /* or something similar */
(您的InitPoints函数存在类似问题)
这是一个参考:
答案 2 :(得分:1)
这就是为什么我会这样做
for (i = 0; i < size; i++)
{
orig[i].x = a++;
orig[i].y = b++;
}
答案 3 :(得分:0)
在C中,向POINT *指针添加一个整数会使指针前进不是这个字节数,而是前进那个POINT结构数。
您的代码中有两个位置,用于向指针添加sizeof(POINT)
。相反,你应该加1。