结构体嵌套中结构体指针引用问题及向量初始化代码求助
修复你的Vector初始化内存错误
嘿,我瞅见你在写线性代数里Vector的初始化函数时踩了内存分配的坑,咱们来把这个问题掰扯清楚,顺便给你把代码修好。
先看看你写的这段代码:
int buildNormalVector(double x, double y, double z, Vector **v) { (*v) = (Vector *)malloc(sizeof(Vector *)); (*v)->x = x; (*v)->y = y; (*v)->z = z; (*v)->base = (Basis *)malloc(sizeof(Basis *)); buildSimpleVector(1, 0, 0, &am...
这里的核心问题是你给malloc传错了内存大小!你用sizeof(Vector *)得到的是Vector指针的字节数(一般是4或8字节,看系统是32位还是64位),但你实际需要分配的是整个Vector结构体的内存空间,应该用sizeof(Vector)才对。同理,(*v)->base的分配也犯了一样的错,得改成sizeof(Basis)。
另外,还有两个容易忽略的细节:一是要检查malloc是否成功返回(万一内存不够,malloc会返回NULL,直接访问会崩);二是如果后续的内存分配失败,得把之前已经分配的内存释放掉,不然会造成内存泄漏。
修复后的代码大概是这样的:
int buildNormalVector(double x, double y, double z, Vector **v) { // 分配Vector结构体本身的内存,不是指针的内存 (*v) = malloc(sizeof(Vector)); // 检查内存分配是否成功 if (*v == NULL) { return -1; // 返回错误码表示分配失败 } // 初始化Vector的坐标值 (*v)->x = x; (*v)->y = y; (*v)->z = z; // 分配Basis结构体的内存 (*v)->base = malloc(sizeof(Basis)); if ((*v)->base == NULL) { // 如果base分配失败,先释放已经拿到的Vector内存,避免泄漏 free(*v); *v = NULL; return -1; } // 完成base里的向量初始化,比如你提到的buildSimpleVector buildSimpleVector(1, 0, 0, &((*v)->base->x_axis)); // 这里可以继续初始化y_axis、z_axis之类的 // buildSimpleVector(0, 1, 0, &((*v)->base->y_axis)); // buildSimpleVector(0, 0, 1, &((*v)->base->z_axis)); return 0; // 初始化成功,返回0 }
补充两句:
- 如果你是纯C环境,
malloc的返回值不用强制转成Vector*,因为void*可以隐式转换;要是用C++编译的话,就得加上强制转换(Vector*)了。 - 后续使用完这个Vector之后,记得要递归释放内存:先释放
(*v)->base,再释放*v,不然也会漏内存。
内容的提问来源于stack exchange,提问作者user8298902
相关产品推荐
相关产品推荐

