【问题标题】:Segmentation fault allocating memory with struct of struct使用结构的结构分配内存的分段错误
【发布时间】:2019-01-09 18:29:56
【问题描述】:

我很新,使用分配内存和指针,

我的想法是尝试在结构内部创建一个结构,以便在代码中使用它们,但是到目前为止,我得到了一个我无法管理的分段错误错误。 感谢您的帮助

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

int main()

{

int nb;
double i8,i9,i10;

struct vect3d1
{
        double *x,*y,*z;
};

struct block
{
        int ibl;
        int i,j,k;
        struct vect3d1 *mesh;

};


struct block *blocks;

i8=8.0;


nb=2;
blocks=(struct block *)malloc(nb*sizeof(struct block));

for(int i=0;i<nb;i++){

blocks[i].ibl=i;
blocks[i].mesh->x = calloc(1,sizeof(double));
blocks[i].mesh->x = &i8;

} }

【问题讨论】:

  • blocks[i].mesh-&gt;x = &amp;i8; 已经覆盖了指向刚刚由calloc 返回的内存分配的指针。目前尚不清楚您要通过分配仅用于一个 double 变量的内存来做什么。
  • 我正在尝试分配变量。
  • 试试*blocks[i].mesh-&gt;x = i8;
  • 你还没有为struct vect3d1 *mesh分配内存
  • 你需要mesh作为指针吗?如果可以满足您的目的,结构可以直接包含其他结构。有几个原因可能导致它不显示,但在提供的代码中没有一个是显而易见的。

标签: c struct segmentation-fault malloc calloc


【解决方案1】:

seg 错误的原因是因为您正在取消引用未初始化的指针blocks[i].meshmesh 成员中的地址未知,因为 malloc 返回未初始化的内存(mesh 的值来自使用 blockmalloc 分配的内存)并且取消引用此类指针是未定义的行为。

引用 C11,第 7.22.3.5 章,malloc 函数:

malloc 函数为大小为 由大小指定,其值是不确定的。

引用 C11,附件 §J.2,未定义的行为:

使用malloc函数分配的对象的值

【讨论】:

  • 感谢您的帮助,很抱歉,但我不确定是否正确理解。我也必须为网格分配内存?为什么?块的 malloc 还不够?
  • meshblock 内的指针。当您为block 分配空间时,您为block 结构分配了足够的空间,其中包括int iblint i,j,k 和指针struct vect3d1 *mesh,所以mesh(以及ibli , j, k) 包含不确定的值。如果你尊重一个具有不确定值的指针会发生什么?只有天知道。所以你需要分配大小为struct vect3d1的内存,并将地址放入mesh。所以mesh = (struct vect3d1 *)malloc(sizeof (struct vect3d1))
猜你喜欢
  • 2021-08-06
  • 2021-06-12
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 2022-08-20
  • 2010-11-20
相关资源
最近更新 更多