2013-02-23 119 views
0

我正确地说,如果我想改变结构中的变量的内容,我必须给结构的指针,使用不同的函数来改变结构,比如这样的:更改结构中的变量C

结构:

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

的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

没有关于'struct maze'的信息,只有'struct data'。你还没有显示'mazePointer'指向什么,等等...... – 2013-02-23 17:28:51

+3

对于一个脚本小孩你做了一个糟糕的工作复制粘贴的东西。 – cnicutar 2013-02-23 17:29:04

+0

@ H2CO3对不起,替换我的变量 – 2013-02-23 17:39:02

回答

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不需要结构前缀:

data* init_maze(void) 


data information; 

也未使用

+0

这是否意味着我需要以“malloc(sizeof(data))”的方式为此数据分配内存,以便在初始化“数据”时获得所需的内存? – 2013-02-23 17:38:38

+0

对不起,只好编辑它,因为我编辑我的问题使用不同的变量名称 – 2013-02-23 17:42:06

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; 
} 

你可以调用B)的指针堆栈或堆在一个结构数据:

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

//初始化 init_maze(& foo); init_maze(bar);

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

你也可以使用一个指向指针参数的指针,这样你仍然可以返回其他东西,比如错误代码。经常使用:

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

    return 0; 
} 
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做它的工作。

0

另一个答案涉及使用指针正常,但对于不同的方法,你可以通过周围结构就像简单变量,所以考虑这个版本:

struct data init_maze(void) { 

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

    return information; 
} 

这并不像周围传递指针一样有效,但对于大多数实际用途和大多数案例的差异是无关紧要的。这个结构体的大小是两个整数,这使得它在这个类别中更加牢固。