jtc*_*cey 0 c arrays malloc pointers
遇到分段错误并且不明白为什么,必须传入三重指针进行赋值,因此无法更改...
这是功能
void alloc2d(double*** a, int m, int n) {
int i, j;
**a = malloc(sizeof(double *) * m);
a[0] = malloc(sizeof(double) * n * m);
for(i = 0; i < m; i++)
a[i] = (*a + n * i);
}
Run Code Online (Sandbox Code Playgroud)
这是函数的调用...
double** m;
alloc2d(&m, 5, 10);
double count = 0.0;
for (int i = 0; i < 5; i++)
for (int j = 0; j < 10; j++)
m[i][j] = ++count;
for (int i = 0; i < 5; i++)
for (int j = 0; j < 10; j++)
printf("%f ", m[i][j]);
Run Code Online (Sandbox Code Playgroud)
您想为 wherea所指的指针分配内存。更改**a = malloc(sizeof(double *) * m);为*a = malloc(sizeof(double *) * m);。你已经为 分配了内存a[0],所以用 index 开始你的循环1。该类型a[0]是类似*a的double**,但你要设置在指针a[0]指。更改a[0]到(*a)[0]和a[i]到(*a)[i]。像这样调整你的代码:
void alloc2d(double*** a, int m, int n) {
*a = malloc( sizeof( double* ) * m ); // allocate the memory for (m) double*
(*a)[0] = malloc( sizeof(double) * n * m ); // allocate the linearized memory for (n*m) double
for( int i=1; i<m; i++ )
(*a)[i] = (*a)[0] + n*i; // initialize the pointers for rows [1, m[
}
Run Code Online (Sandbox Code Playgroud)
我认为这会更容易理解:
void alloc2d(double*** a, int m, int n) {
double **temp = malloc( sizeof( double* ) * m ); // allocate the memory for (m) double*
temp[0] = malloc( sizeof(double) * n * m ); // allocate the linearized memory for (n*m) double
for ( int i=1; i<m; i++ )
temp[i] = temp[0] + n*i; // initialize the pointers for rows [1, m[
*a = temp; // assign dynamic memory pointer to output parameter
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1711 次 |
| 最近记录: |