免责声明:我对C很新。我试图找到答案,但我的谷歌已经失败了,因为我不完全知道我应该用于搜索的条款...
目前,我遇到了一个意想不到的问题,代码int a = 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;在// POINT2
,a
和s->start
现在都是100。
int
声明不应该在尚未被任何东西使用的内存点中创建变量吗?
答案 0 :(得分:4)
您通过在create_buffer
中返回其地址来违反本地变量的范围。
在堆栈上创建局部变量,并在每个函数调用上重用堆栈。通过在result
中返回create_buffer
的地址,您将保存C仅在create_buffer
函数的持续时间内保留供您使用的内存部分的地址。当它终止时,该内存被重用。在这种情况下,当您致电method
时,它是否与您的s
变量对齐。您需要使用malloc
根据您的编译器,您应该收到有关返回局部变量地址的警告。
答案 1 :(得分:2)
请原谅我的无知,但在C中,create_buffer
是否可能?您正在堆栈上创建result
,然后返回指向它的指针。 result
执行后create_buffer
是否会被销毁?所以现在s
指向'垃圾'。也许,就像aib在评论中所说的那样,内存中的地址恰好是a
的地址。
相反,create_buffer
也应该malloc
buffer
,然后您可以安全地返回指向它的指针。