繁体   English   中英

使用malloc在函数中分配类型的空间

[英]Allocating space for type within a function with malloc

我写了一个类型

typedef
  struct matrix_s {
    int size;
    float *values;
  } matrix_t;

我在这样的函数中分配:

matrix_t *matrix;
genmat(mat, afloatarray, thesize);

//Function
void genmat(matrix_t *mat, float *_values, int _size) {
  mat = (matrix_t*) malloc(sizeof(matrix_t)); 
  mat->values = _values;
  mat->size = _size;
}

不应矩阵具有相同的指针,因为我传递一个指针和工作的指针。

您需要传递指针的地址或返回新分配的指针。

matrix_t *genmat(float *_values, int _size)
{
    mat = malloc(sizeof(*mat)); 
    if (mat == NULL)
        return NULL;
    mat->values = _values;
    mat->size = _size;

    return mat;
}

接着

matrix_t *matrix;
matrix = genmat(afloatarray, thesize);

要么

void genmat(matrix_t **out, float *_values, int _size)
{
    *out = malloc(sizeof(**out)); 
    if (*out == NULL)
        return;
    (*out)->values = _values;
    (*out)->size = _size;
}

接着

matrix_t *matrix;
genmat(&matrix, afloatarray, thesize);

这样做的原因是,在参数中始终按值传递参数,并且尽管您可以修改指针所指向的数据,但是您无法在函数内部重新分配指针,因为它不会影响调用方函数的指针,因为参数指针和调用程序函数中的指针具有不同的地址,尽管它们都存储相同的地址。

在我的第二个示例解决方案中,该函数获取指针的地址,然后可以通过取消引用双指针来修改main()的指针。

您需要将Matrix的指针传递给genmat()

看起来像:

matrix_t *matrix;
genmat(&mat, afloatarray, thesize);

//Function
void genmat(matrix_t **mat, float *_values, int _size) {
  *mat = malloc(sizeof(matrix_t)); 
  if (*mat == NULL) // Do not dereference a NULL poitner
      return;
  (*mat)->values = _values;
  (*mat)->size = _size;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM