正确的分配语法
Right syntax for allocation
如果我采用下面的 2 个片段代码(它们是等效的):
double ***x;
x = malloc(N * sizeof(*x));
for (i = 0; i < size_y; i++) {
x[i] = malloc(N * sizeof(**x));
和
double ***x;
x = malloc(N * sizeof(double*));
for (i = 0; i < size_y; i++) {
x[i] = malloc(N * sizeof(double**));
上面第一个的语法应该是:
double ***x;
x = malloc(N * sizeof(*x));
for (i = 0; i < size_y; i++) {
x[i] = malloc(N * sizeof(*x));
我的意思是,对于 x
、x[i]
和 x[i][j]
malloc
分配,语法将保留“sizeof(*x)
”,这样对吗?
??
第二个应该是:
double ***x;
x = malloc(N * sizeof(double**));
for (i = 0; i < size_y; i++) {
x[i] = malloc(N * sizeof(double*));
??
我从 this link
看到了这个语法
It is safer becuse you don't have to mention the type name twice and
don't have to build the proper spelling for "dereferenced" version of
the type. For example, you don't have to "count the stars" in
int *****p = malloc(100 * sizeof *p);
Compare that to the type-based sizeof in
int *****p = malloc(100 * sizeof(int ****));
where you have too make sure you used the right number of * under
sizeof.
问候
更新 1:
我在作为模式的语法下面得到了一个答案:
p = malloc(N * sizeof *p);
N
、sizeof
和 *p
之间的空格和 sizeof *p
(而不是 sizeof(*p)
)的括号是否必须是严格应用此分配的语法?
在我的代码中,我做了:
/* Arrays */
double** x;
double** x0;
/* Allocation of 2D arrays */
x = malloc(size_tot_y*sizeof(*x));
x0 = malloc(size_tot_y*sizeof(*x0));
for(i=0;i<=size_tot_y-1;i++)
{
x[i] = malloc(size_tot_x*sizeof(**x));
x0[i] = malloc(size_tot_x*sizeof(**x0));
}
如您所见,我在 sizeof
中使用了括号,而在 size_tot_*
、sizeof
和 *p
之间没有使用空格。
我的语法是否改变了什么以符合上述模式?
这可能是个愚蠢的问题,但我想得到确认。
谢谢
模式是:
p = malloc(N * sizeof *p);
将p
替换为相同的内容。例如:
x[i] = malloc(N * sizeof *x[i]);
有时人们将*x[i]
缩写为**x
,因为**x
表示*x[0]
,而x[0]
和x[i]
具有相同的知识大小,因为数组的所有元素必须具有相同的类型,因此大小也相同。
但是如果你对这一切都没有信心,那么你可以坚持基本模式并使用*x[i]
。
有两件事,
- 指针保存分配的地址 space 和
- malloc() 分配 space 提供的大小。所以,malloc(1) 将分配 1 个字节,malloc(sizeof(double)) 将分配字节数(可能是 8 个字节)需要 double,malloc(sizeof(double *)) 将分配该地址所需的字节数(可能是 4 个字节)。
所以,
作为第一个参考,
double *d1 = (double *) mallloc(sizeof(double)); // for single value
或者,
double *d1 = (double *) malloc(N * sizeof(double)); // for array
与第二个参考类似,
double **d2 = (double **) malloc(N * sizeof(double *));
对于第 3 个参考,
double ***d3 = (double ***) malloc(N * sizeof(double *));
现在,我们可以考虑,
void mallocTest()
{
const int N = 10;
double ***x;
x = (double ***)malloc(N * sizeof(double *));
for (int i = 0; i < N; i++) {
x[i] = (double **)malloc(N * sizeof(double *));
for (int j = 0; j < N; j++) {
x[i][j] = (double *)malloc(sizeof(double)); // for single value;
//x[i][j] = (double *)malloc(N * sizeof(double)); // for array, here N == 10 elements
*x[i][j] = i*j; // or
//x[i][j][0] = i*j;
}
}
for (int i = 0; i < N; i++){
for (int j = 0; j < N; j++){
//printf("%f ", *x[i][j]); // or
printf("%f ", x[i][j][0]);
}
printf("\n");
}
}
如果我采用下面的 2 个片段代码(它们是等效的):
double ***x;
x = malloc(N * sizeof(*x));
for (i = 0; i < size_y; i++) {
x[i] = malloc(N * sizeof(**x));
和
double ***x;
x = malloc(N * sizeof(double*));
for (i = 0; i < size_y; i++) {
x[i] = malloc(N * sizeof(double**));
上面第一个的语法应该是:
double ***x;
x = malloc(N * sizeof(*x));
for (i = 0; i < size_y; i++) {
x[i] = malloc(N * sizeof(*x));
我的意思是,对于 x
、x[i]
和 x[i][j]
malloc
分配,语法将保留“sizeof(*x)
”,这样对吗?
??
第二个应该是:
double ***x;
x = malloc(N * sizeof(double**));
for (i = 0; i < size_y; i++) {
x[i] = malloc(N * sizeof(double*));
??
我从 this link
看到了这个语法It is safer becuse you don't have to mention the type name twice and don't have to build the proper spelling for "dereferenced" version of the type. For example, you don't have to "count the stars" in
int *****p = malloc(100 * sizeof *p);
Compare that to the type-based sizeof in
int *****p = malloc(100 * sizeof(int ****));
where you have too make sure you used the right number of * under sizeof.
问候
更新 1:
我在作为模式的语法下面得到了一个答案:
p = malloc(N * sizeof *p);
N
、sizeof
和 *p
之间的空格和 sizeof *p
(而不是 sizeof(*p)
)的括号是否必须是严格应用此分配的语法?
在我的代码中,我做了:
/* Arrays */
double** x;
double** x0;
/* Allocation of 2D arrays */
x = malloc(size_tot_y*sizeof(*x));
x0 = malloc(size_tot_y*sizeof(*x0));
for(i=0;i<=size_tot_y-1;i++)
{
x[i] = malloc(size_tot_x*sizeof(**x));
x0[i] = malloc(size_tot_x*sizeof(**x0));
}
如您所见,我在 sizeof
中使用了括号,而在 size_tot_*
、sizeof
和 *p
之间没有使用空格。
我的语法是否改变了什么以符合上述模式?
这可能是个愚蠢的问题,但我想得到确认。
谢谢
模式是:
p = malloc(N * sizeof *p);
将p
替换为相同的内容。例如:
x[i] = malloc(N * sizeof *x[i]);
有时人们将*x[i]
缩写为**x
,因为**x
表示*x[0]
,而x[0]
和x[i]
具有相同的知识大小,因为数组的所有元素必须具有相同的类型,因此大小也相同。
但是如果你对这一切都没有信心,那么你可以坚持基本模式并使用*x[i]
。
有两件事,
- 指针保存分配的地址 space 和
- malloc() 分配 space 提供的大小。所以,malloc(1) 将分配 1 个字节,malloc(sizeof(double)) 将分配字节数(可能是 8 个字节)需要 double,malloc(sizeof(double *)) 将分配该地址所需的字节数(可能是 4 个字节)。
所以, 作为第一个参考,
double *d1 = (double *) mallloc(sizeof(double)); // for single value
或者,
double *d1 = (double *) malloc(N * sizeof(double)); // for array
与第二个参考类似,
double **d2 = (double **) malloc(N * sizeof(double *));
对于第 3 个参考,
double ***d3 = (double ***) malloc(N * sizeof(double *));
现在,我们可以考虑,
void mallocTest()
{
const int N = 10;
double ***x;
x = (double ***)malloc(N * sizeof(double *));
for (int i = 0; i < N; i++) {
x[i] = (double **)malloc(N * sizeof(double *));
for (int j = 0; j < N; j++) {
x[i][j] = (double *)malloc(sizeof(double)); // for single value;
//x[i][j] = (double *)malloc(N * sizeof(double)); // for array, here N == 10 elements
*x[i][j] = i*j; // or
//x[i][j][0] = i*j;
}
}
for (int i = 0; i < N; i++){
for (int j = 0; j < N; j++){
//printf("%f ", *x[i][j]); // or
printf("%f ", x[i][j][0]);
}
printf("\n");
}
}