簡體   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