C 新变量指向旧变量

C 新变量指向旧变量,c,pointers,variable-assignment,C,Pointers,Variable Assignment,免责声明:我对C非常陌生。我试图找到答案,但我的google fu失败得很惨,因为我不知道搜索应该使用什么术语 目前,我遇到了一个意想不到的问题,代码inta=100使结构内的整数也更改值 从调试器中,我可以看到a和s->pos都指向相同的值。这是我的代码的净化版本 typedef struct { char data[4096]; int start; int end; } buffer; typedef struct { int * data; in

免责声明:我对C非常陌生。我试图找到答案,但我的google fu失败得很惨,因为我不知道搜索应该使用什么术语

目前,我遇到了一个意想不到的问题,代码
inta=100使结构内的整数也更改值

从调试器中,我可以看到a和s->pos都指向相同的值。这是我的代码的净化版本

typedef struct {
    char data[4096];
    int start;
    int end;
} buffer;

typedef struct {
    int * data;
    int length;
} data_format;

buffer * create_buffer() {
    buffer result;
    result.start = -1;
    return &result;
}

data_format * method(buffer * s) {
    data_format result = (data_format) { malloc(100), 0 };
    ... // POINT1
    int a = 100;
    ... // POINT2
}

int main(int argc, char **argv) {
    buffer * s = create_buffer();
    data_format * df = method(s);
}
从调试器中,我可以看到在标有
//POINT1
的行中,
a
是-1;在
//点2
a
s->start
现在都是100


int
声明不应该在内存点中创建一个还没有被任何东西使用的变量吗?

请原谅我的无知,但是在C中,类似于
create\u buffer
的东西是可能的吗?您正在堆栈上创建
result
,然后返回指向它的指针。执行
create\u buffer
后,
result
不会被销毁吗?所以现在
s
指向“垃圾”。也许,正如aib在评论中所说,它指向的内存地址恰好是
a
的地址


相反,
create\u buffer
也应该
malloc
缓冲区
buffer
,然后您可以安全地返回指向该缓冲区的指针。

请原谅我的无知,但是在C语言中,类似于
create\u buffer
的东西是可能的吗?您正在堆栈上创建
result
,然后返回指向它的指针。执行
create\u buffer
后,
result
不会被销毁吗?所以现在
s
指向“垃圾”。也许,正如aib在评论中所说,它指向的内存地址恰好是
a
的地址


相反,
create\u buffer
也应该
malloc
buffer
,然后您可以安全地返回指向该缓冲区的指针。

您在
create\u buffer
中返回其地址,违反了局部变量的范围

局部变量在堆栈上创建,堆栈在每次函数调用中重用。通过在
create_buffer
中返回
result
的地址,您保存的是C仅在
create_buffer
功能期间保留供您使用的一段内存的地址。当它终止时,该内存被重用。在这种情况下,当您调用
方法时,它是否与
s
变量对齐。您需要使用
malloc


根据编译器的不同,您应该会收到一条关于返回局部变量地址的警告

create\u buffer
中返回局部变量的地址,违反了局部变量的作用域

局部变量在堆栈上创建,堆栈在每次函数调用中重用。通过在
create_buffer
中返回
result
的地址,您保存的是C仅在
create_buffer
功能期间保留供您使用的一段内存的地址。当它终止时,该内存被重用。在这种情况下,当您调用
方法时,它是否与
s
变量对齐。您需要使用
malloc


根据编译器的不同,您应该会收到一条关于返回局部变量地址的警告

我怀疑在您未显示的函数中,您正在以与
result
类似的方式分配缓冲区
s
,然后执行
return&s
或类似操作,因为这似乎就是您从显示的函数返回结果的方式。是的,s可能指向方法堆栈的开始,malloc,0和100与buffer.data,start和end重叠。虽然我们不能确定,因为张贴的代码是不完整的。它甚至没有编译。@iagreen我只是编辑了这个问题。我确实像你说的那样创造了一个新的世界。但是我不明白如何将
a
分配给与
s->start
@aib相同的记忆点。我的代码很乱,而且充满了其他东西。但是,我的编辑应该使代码现在可以编译了……我怀疑在您没有显示的函数中,您正在以与
result
类似的方式分配缓冲区
s
,然后执行
return&s
或类似操作,因为这似乎就是您从显示的函数返回结果的方式。是的,s可能指向方法堆栈的开始,malloc,0和100与buffer.data,start和end重叠。虽然我们不能确定,因为张贴的代码是不完整的。它甚至没有编译。@iagreen我只是编辑了这个问题。我确实像你说的那样创造了一个新的世界。但是我不明白如何将
a
分配给与
s->start
@aib相同的记忆点。我的代码很乱,而且充满了其他东西。不过,我的编辑应该使代码现在可以编译了…谢谢!现在我更改了
buffer result=malloc(sizeof(buffer))
。我应该让ceate_buffer返回一个真正的缓冲区而不是指针吗?不,仍然返回指针,将您的声明更改为指针--
buffer*result=malloc(sizeof(buffer))
。您还必须对
数据格式结果执行相同的操作,并且必须逐个初始化结构元素,因为我认为
{}
初始值设定项不能在动态分配的对象上工作。谢谢!现在我更改了
buffer result=malloc(sizeof(buffer))
。我应该让ceate_buffer返回一个真正的缓冲区而不是指针吗?不,仍然返回指针,将您的声明更改为指针--
buffer*result=malloc(sizeof(buffer))
。您必须对
数据\u fo执行相同的操作