我动态分配了一个表示一系列点的结构数组。但是,当我尝试为其成员分配值时,程序会分配不同的值。我做错了什么?
计划的输出:
1) Reminder#update_verified should mark the reminder.verified to true
Failure/Error: expect(reminder.verified).to eq(true)
expected: true
got: false
(compared using ==)
# ./spec/models/reminder_spec.rb:46:in `block (3 levels) in <top (required)>'
Finished in 0.19193 seconds (files took 7.07 seconds to load)
代码:
xy[0].x= 0
xy[0].y= 0
xy[1].x= 1
xy[1].y= 1
xy[2].x= 2
xy[2].y= 2
xy[3].x= 1041
xy[3].y= 0
答案 0 :(得分:2)
我做错了什么?
问题是,当您重新分配 xy
int resize()
函数的大小时,您没有分配足够的内存:
void resize(Point*xy) {
xy = (Point*) realloc( xy, sizeof(Point));
此处,realloc(xy,sizeof(Point));
仅为1
结构分配内存,因此您只能访问xy[0].x
和xy[0].y
但是,在for循环中,您可以访问xy[1]
,xy[2]
和xy[3]
...这是
访问越界,这会产生undefined behavior
因此,您得到未定义的输出。
解决方案:
使用
分配足够的内存realloc()
当你迭代for循环4
(n = 0到3)时,我想你需要为4
个结构<分配内存/ p>
只需将4乘以realloc()
函数中resize()
的第二个参数
xy = (Point*)realloc( xy, 4*sizeof(Point)); //multiply with 4
这里分配了足够的内存来存储4
结构
输出 (更改后)
xy[0].x= 0
xy[0].y= 0
xy[1].x= 1
xy[1].y= 1
xy[2].x= 2
xy[2].y= 2
xy[3].x= 3
xy[3].y= 3
建议:
首先,
不要 施放 malloc()
(和 realloc()
)的值,因为它们返回void
类型,它会自动转换为指定它的指针的数据类型。
所以代替:
xy = (Point*)realloc(xy,4*sizeof(Point)); //same for malloc dont cast
使用
xy= realloc(xy,4*sizeof(Point));
如需进一步阅读,请参阅:click
然后,
int main()
,而是使用int main(void)
,因为没有任何参数被发送到main()
函数。但是,在第一种情况下是{{1} 1}},可以将任意数量的参数发送到int main()
函数... 答案 1 :(得分:1)
调整大小功能有两个问题:
void resize(Point*xy) {
xy=(Point*)realloc(xy,sizeof(Point)); // changes local variable
for (n=0;n<4;n++)
{
xy[n].x=n;
xy[n].y=n;
}
}
首先,您将分配的大小从2*sizeof(Point)
缩减为sizeof(Point)
。 realloc
的第二个参数是分配的新总大小,而不是您要添加的大小。
其次,您的函数仅修改局部变量xy
,它不会返回它或使调用者知道。主要:
// imagine xy = 0x10000.
resize(xy) ; // frees 0x10000 and allocates new memory
// xy here is still 0x10000
您需要在调整大小时使用Point**
指针,或者需要调整大小以返回其本地xy值:
Point* resize(Point*xy) {
int n;
xy=(Point*)realloc(xy, 4*sizeof(Point));
for (n=0;n<4;n++)
{
xy[n].x=n;
xy[n].y=n;
}
return xy;
}
或
void resize(Point** xyp) {
int n;
*xyp=(Point*)realloc(*xyp, 4*sizeof(Point));
for (n=0;n<4;n++)
{
(*xyp)[n].x=n;
(*xyp)[n].y=n;
}
}
示例:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int x, y;
} Point;
void resize(Point** xyp) {
int n;
*xyp=(Point*)realloc(*xyp, 4*sizeof(Point));
for (n=0;n<4;n++)
{
(*xyp)[n].x=n;
(*xyp)[n].y=n;
}
}
int main () {
int n;
Point *xy;
xy=(Point*)malloc(2*sizeof(Point));
for (n=0;n<2;n++)
{
xy[n].x=n;
xy[n].y=n;
}
resize(&xy) ;
for (n = 0; n<4; n++) {
printf("xy[%i].x= %i \n",n,xy[n].x);
printf("xy[%i].y= %i \n",n,xy[n].y);
}
free(xy);
return 0;
}