新变量指向旧变量

时间:2013-01-21 02:48:01

标签: c pointers variable-assignment

免责声明:我对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;在// POINT2as->start现在都是100。

int声明不应该在尚未被任何东西使用的内存点中创建变量吗?

2 个答案:

答案 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,然后您可以安全地返回指向它的指针。