c - 指向结构体、字段的指针莫名其妙地改变值

标签 c pointers structure

我已经做好了被告知我正在做一些愚蠢/错误的事情的准备;这就是我所期望的。

我对结构有了一定的了解,并且在从指针访问字段时感到很困惑。要遵循的代码。

矩阵.h:

#ifndef MATRIX_H_INCLUDED
#define MATRIX_H_INCLUDED

#include <stdlib.h>

typedef struct
{
    size_t size;
    int* vector;
} vector_t;

#endif // MATRIX_H_INCLUDED

main.c:

#include <stdio.h>
#include <stdlib.h>

#include "matrix.h"

vector_t* vector_new(size_t size)
{
    int vector[size];
    vector_t v;
    v.size = size;
    v.vector = vector;
    return &v;
}

int main(int argc, char* argv[])
{
    vector_t* vec = vector_new(3);
    printf("v has size %d.\n", vec->size);
    printf("v has size %d.\n", vec->size);

    return EXIT_SUCCESS;
}

这是一个非常简单的程序,我创建了一个大小为 3 的 vector 结构,返回指向该结构的指针,然后打印其大小。在第一个打印实例中,该值是 3,然后在下一次打印时更改为 2686668。这是怎么回事?

提前致谢。

最佳答案

您正在从 vector_new 返回指向局部变量 v 的指针。这没有丝毫发挥作用的机会。当vector_new返回到main时,所有局部变量都被销毁,你的指针指向任何地方。而且,v.vector指向的内存也是一个局部数组vector。当 vector_new 返回时它也会被销毁。

这就是为什么您会看到 printf 打印出垃圾。

您的代码必须在内存管理方面完全重新设计。实际的数组必须使用malloc动态分配。 vector_t 对象本身可以动态分配,也可以在 main 中声明为局部变量并传递给 vector_new 进行初始化。 (您想遵循哪种方法取决于您)。

例如,如果我们决定使用动态分配来完成所有操作,那么它可能如下所示

vector_t* vector_new(size_t size)
{
   vector_t* v = malloc(sizeof *v);
   v->size = size;
   v->vector = malloc(v->size * sizeof *v->vector);
   return v;
}

(并且不要忘记检查 malloc 是否成功)。

但是,我们动态分配的所有内容都必须稍后使用free 来取消分配。因此,您必须为此目的编写一个 vector_free 函数。

关于c - 指向结构体、字段的指针莫名其妙地改变值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26262951/

相关文章:

c++ - 分离线程的参数问题

c - 如何坚持 C 编译器将局部变量放在堆栈上,而不是寄存器中

c - 试图用两个定界符分开但它不起作用 - C

C - pthread 参数

c++ - 为什么前向声明不适用于类?

c - 函数更改其他变量的数据

c - struct 中这个 `data[0]` 声明的目的是什么?

c - 将 C 库链接到 R

c++ - 了解数组和指针之间的关系

c - 如何在 C 中完成使用指针运算而不是数组下标的功能?