免责声明:我是 C 的新手。我试图找到这个问题的答案,但我的 google-fu 惨遭失败,因为我不完全知道应该使用哪些术语进行搜索...
目前,我遇到了一个意想不到的问题,代码 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
声明不应该在尚未被任何东西使用的内存点中创建一个变量吗?
最佳答案
您通过返回 create_buffer
中的地址违反了局部变量的范围。
局部变量是在栈上创建的,栈在每次函数调用时被重用。通过在 create_buffer
中返回 result
的地址,您将保存 C 仅在 create_buffer< 期间供您使用的内存部分的地址
功能。当它终止时,该内存将被重用。在这种情况下,当您调用 method
时,它是否与您的 s
变量对齐。您需要使用 malloc
根据您的编译器,您应该会收到有关返回局部变量地址的警告。
关于c - 新变量指向旧变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14431842/