我已经做好了被告知我正在做一些愚蠢/错误的事情的准备;这就是我所期望的。
我对结构有了一定的了解,并且在从指针访问字段时感到很困惑。要遵循的代码。
矩阵.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/