首页 > 解决方案 > 修改结构实例的变量

问题描述

struct test{

    int value;
    struct test *child;
};


void change(struct test *t){

    t->child[1].value = 100000;
    t->child[0].value = 100000;
} 

int main (void) {

    struct test *f = (struct test *)malloc(sizeof(struct test));
    struct test *s = (struct test *)malloc(sizeof(struct test));
    struct test *t = (struct test *)malloc(sizeof(struct test));
    struct test *list = (struct test *)malloc(2*sizeof(struct test));

    f->value = 1;
    s->value = 1;
    t->value = 1;
    list[0] = *s;
    list[1] = *t;
    f->child = list;
    //init(t);was a typo
    change(f)
    printf("%d",t->value);

}

如何在不更改结构和参数的情况下将 t->value 的值更改为 100000?我试图在 change() 中创建结构的新实例,但仍然无法正常工作。

标签: c

解决方案


您的代码中有几个问题(可能与您的问题无关):
1.“init”函数未定义,我认为这应该是“change”。
2.如果你调用change(t),你正在访问未初始化的指针,你的程序的行为将是未定义的,所以我假设而不是

f->child = list

你的意思是:

t->child = list
  1. 我猜你不想像我上面提到的那样使用第 2 步,而是想以某种方式让程序在 f 中写一些东西,大小比 f 长,这样程序就会溢出并开始在下一个内存位置上写,所以“在不改变结构和参数”的情况下,正如你提到的,t 的值会改变。如果是这种情况(我希望我能写出问题),那么您忽略了这样一个事实,即连续调用 malloc 并不能保证分配连续的内存块,我运行了您的代码,以下是分配给指针的地址:
sizeof struct: 8
addresses : f: b72f18 , s: b72f48 , t: b72f80 , list: b72f90

所有这些答案都应该在评论中发布,但评论还没有为我解锁。


推荐阅读