使用 malloc 为函数内的类型分配 space
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 和 mat 不应该有相同的指针,因为我传递了一个指针并使用了一个指针。
您需要传递指针的地址或return新分配的地址。
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);
原因是在c中参数总是按值传递,虽然你可以修改指针指向的数据,但你不能在函数内部重新分配指针,因为它不会影响调用函数的指针,因为参数指针和调用函数中的指针具有不同的地址,尽管它们都存储相同的地址。
在我的第二个示例解决方案中,该函数获取指针的地址,然后它可以通过取消引用双指针来修改 main()
中的指针。
您需要将矩阵的指针传递给 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;
}
我写了一个类型
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 和 mat 不应该有相同的指针,因为我传递了一个指针并使用了一个指针。
您需要传递指针的地址或return新分配的地址。
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);
原因是在c中参数总是按值传递,虽然你可以修改指针指向的数据,但你不能在函数内部重新分配指针,因为它不会影响调用函数的指针,因为参数指针和调用函数中的指针具有不同的地址,尽管它们都存储相同的地址。
在我的第二个示例解决方案中,该函数获取指针的地址,然后它可以通过取消引用双指针来修改 main()
中的指针。
您需要将矩阵的指针传递给 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;
}