c - 新变量指向旧变量

标签 c pointers variable-assignment

免责声明:我是 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 处,as->start 现在都是 100。

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

最佳答案

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

局部变量是在栈上创建的,栈在每次函数调用时被重用。通过在 create_buffer 中返回 result 的地址,您将保存 C 仅在 create_buffer< 期间供您使用的内存部分的地址功能。当它终止时,该内存将被重用。在这种情况下,当您调用 method 时,它是否与您的 s 变量对齐。您需要使用 malloc

动态分配您的返回变量

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

关于c - 新变量指向旧变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14431842/

相关文章:

c - 在函数中使用 char **,我们可以为传递给她的 char * 分配内存

Python def 函数使用 lambda 赋值

python - 重复类实例化和赋值的紧凑形式

c - 64 位到 10 位的哈希函数

c - 条件语句中的按位运算符

c - 免费字符* : invalid next size (fast)

C++ 指针与数组和指针转换

c - 带有自定义 Makefile 的 Eclipse C 调试器

c++ - 指向结构或类的指针与指向第一个字段的指针

python - 主机中任务的指派/分配