无法为结构成员分配值

时间:2016-07-02 22:06:27

标签: c arrays dynamic struct structure

我动态分配了一个表示一系列点的结构数组。但是,当我尝试为其成员分配值时,程序会分配不同的值。我做错了什么?

计划的输出:

  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 

2 个答案:

答案 0 :(得分:2)

  

我做错了什么?

  • 问题是,当您重新分配 xy int resize()函数的大小时,您没有分配足够的内存:

    void resize(Point*xy) {
    xy = (Point*) realloc( xy, sizeof(Point));
    
  • 此处,realloc(xy,sizeof(Point));仅为1结构分配内存,因此您只能访问xy[0].xxy[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;
}

http://ideone.com/gIntgl