在C中更改结构的变量

时间:2013-02-23 17:27:07

标签: c pointers struct

我是否正确地说如果我想改变结构中变量的内容,我必须给出一个指向结构的指针,使用不同的函数来改变结构,如下所示:

结构:

typedef struct data{
    int row;
    int column; 
}data;

struct changer函数中的var:

struct data* init_maze(void) {

    data information;      //init information struct
    data *infoPoint;       //int information struct pointer

    int row = 6;
    int column = 10;

    infoPoint->row = row;   //not working but should be updating information
    infoPoint->column = column; //same as above

    return infoPoint;
}

但这不符合预期。代码中断,没有任何反应。任何人都可以解释我做错了什么。

4 个答案:

答案 0 :(得分:0)

infoPoint应声明为:

data* infoPoint = malloc (sizeof(data));

然后这段代码应该有效:

infoPoint->row = row;   //not working but should be updating information
infoPoint->column = column; //same as above



函数init_maze不需要struct prefix:

data* init_maze(void) 


data information;  

也未使用

答案 1 :(得分:0)

首先问问自己,你想在这里完成什么。

例如,您声明“数据信息”并且您从不使用它。在操作它之前,你甚至没有将“infoPoint”指向任何东西。既然你没有写任何“SEGFAULT”,我想你是在省略一些代码?

反正。您是否要创建一个新的“数据”结构并返回一些初始值?然后你必须: A)分配一些内存并在堆上返回指向这段内存的指针(必须用malloc(或类似的)分配并在某些时候释放释放“

B)您可以将指向结构数据的指针作为参数,并将您的值放在那里。

data *init_maza(void) {
   data *infoPoint = malloc(sizeof(struct data));

   data->row = 6;
   data->column = 10;

   return data;
}

void init_maze(data *outp) {
   outp->row = 6;
   data->column = 10;
}

您可以使用指向堆栈或堆上的struct数据的指针调用B):

数据foo; data * bar = malloc(sizeof(struct data));

//初始化 init_maze(安培;富); init_maze(巴);

请注意&符号'&','address-of'运算符。

您还可以使用指向指针参数的指针,这样您仍然可以返回其他内容,例如错误代码。经常使用:

int init_maze(data **d) {
    *data = malloc(sizeof(struct data));
    (*data)->row = 6;
    (*data)->column = 10;

    return 0;
}

答案 2 :(得分:0)

您的示例代码正在尝试修改指向结构的未初始化指针,因此infoPoint->row = row;是无效操作,因为infoPoint未初始化。

您可以像这样更改您的初始化函数:

void init_maze(data *infoPoint) {
    infoPoint->row = 6;
    infoPoint->column = 10;
}

然后像这样使用它:

int main()
{
    data information;
    init_maze(&information);
}

data information;会在堆栈上分配你的结构,你可以传递一个指向它的指针init_maze来完成它的工作。

答案 3 :(得分:0)

另一个答案涵盖正确使用指针,但对于不同的方法,你可以像简单的变量一样传递结构,所以请考虑这个版本:

struct data init_maze(void) {

    data information;   
    information.row = 6;   
    information.column = 10;

    return information;
}

这不如传递指针那么有效,但对于大多数实际目的而言,大多数情况下差异无关紧要。在这里,这个结构的大小是两个整数,这使它稳固地属于这一类。