0

免责声明:我对 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);
}

从调试器中,我可以看到在标有 的行中// POINT1a是 -1;在// POINT2,两者as->start现在都是 100。

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

4

2 回答 2

4

您通过在 中返回其地址违反了局部变量的范围create_buffer

局部变量是在栈上创建的,栈在每次函数调用时都会被复用。通过返回 in 的地址,resultcreate_buffer可以保存 C 仅在函数执行期间保留供您使用的一段内存的地址create_buffer。当它终止时,该内存被重用。在这种情况下,当您调用时,它是否与您的变量method对齐。s您需要动态分配您的返回变量malloc

根据您的编译器,您应该会收到有关返回局部变量地址的警告。

于 2013-01-21T03:28:47.347 回答
2

请原谅我的无知,但是在 C 中,create_buffer甚至可能吗?您正在result堆栈上创建,然后返回一个指向它的指针。被执行后不会result被销毁吗?create_buffer所以现在s指向'垃圾'。也许,就像 aib 在评论中所说,它指向的内存地址恰好是a.

相反,create_buffer如果malloc,buffer那么你可以安全地返回一个指向它的指针。

于 2013-01-21T03:26:54.043 回答