C 新变量指向旧变量
免责声明:我对C非常陌生。我试图找到答案,但我的google fu失败得很惨,因为我不知道搜索应该使用什么术语 目前,我遇到了一个意想不到的问题,代码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
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执行相同的操作