我是否正确地说如果我想改变结构中变量的内容,我必须给出一个指向结构的指针,使用不同的函数来改变结构,如下所示:
结构:
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;
}
但这不符合预期。代码中断,没有任何反应。任何人都可以解释我做错了什么。
答案 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;
}
这不如传递指针那么有效,但对于大多数实际目的而言,大多数情况下差异无关紧要。在这里,这个结构的大小是两个整数,这使它稳固地属于这一类。