#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
void allocate_double_2darray(int ip_flag, double **ip_array, int num_row, int num_col);
int main(void)
{
int num_row, num_col;
double **temp_array;
num_row = 4;
num_col = 2;
allocate_double_2darray(0, temp_array, num_row, num_col); //Allocate memory
allocate_double_2darray(1, temp_array, num_row, num_col); //initialize
allocate_double_2darray(2, temp_array, num_row, num_col); //Free Memory
return 0;
}
void allocate_double_2darray(int ip_flag, double **ip_array, int num_row, int num_col)
{
int i_loop, j_loop;
if(ip_flag == 0) //allocate (free) memeory from array
{ ip_array = malloc(sizeof(double *) * num_row);
for(i_loop = 0; i_loop < num_row; i_loop++)
ip_array[i_loop] = malloc(sizeof(double) * num_col);
}
if(ip_flag == 1) //initialize to zero
{
for(i_loop = 0; i_loop < num_row; i_loop++)
for(j_loop = 0; j_loop < num_col; j_loop++)
ip_array[i][j] = 0.0;
}
if(ip_flag == 2) //deallocate (free) memeory from array
{
for(i_loop = 0; i_loop < num_row; i_loop++)
free(ip_array[i_loop]);
free(ip_array);
}
}
这是分配内存以创建二维数组的简单函数。它编译成功。但是,当我执行它时,它给我分段错误错误。有没有人帮我找到我在这里做错了什么?
答案 0 :(得分:0)
您无法从函数内部更改指针的值。您可以使用指针并更改其内容,不能更改指针本身并期望它在外面可用。
在您的情况下,使用ip_flag==0
的调用没有做任何有用的事情,当使用ip_flag==1
调用它时会出现段错误。
可能的解决方案:
ip_array = malloc(sizeof(double *) * num_row);
更改为函数allocate_double2d_array
的外部。答案 1 :(得分:0)
更改函数参数,使其获取指向矩阵的指针,这样您就可以通过传递指针本身的地址来更改指针指向的位置。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
void allocate_double_2darray(int ip_flag, double **ip_array, int num_row, int num_col);
int main(void)
{
int num_row, num_col;
double **temp_array;
num_row = 4;
num_col = 2;
allocate_double_2darray(0, &temp_array, num_row, num_col); //Allocate memory
allocate_double_2darray(1, &temp_array, num_row, num_col); //initialize
allocate_double_2darray(2, &temp_array, num_row, num_col); //Free Memory
return 0;
}
void allocate_double_2darray(int ip_flag, double ***ip_array, int num_row, int num_col)
{
int i_loop, j_loop;
if(ip_flag == 0) //allocate (free) memeory from array
{ (*ip_array) = malloc(sizeof(double *) * num_row);
for(i_loop = 0; i_loop < num_row; i_loop++)
(*ip_array)[i_loop] = malloc(sizeof(double) * num_col);
}
if(ip_flag == 1) //initialize to zero
{
for(i_loop = 0; i_loop < num_row; i_loop++)
for(j_loop = 0; j_loop < num_col; j_loop++)
(*ip_array)[i][j] = 0.0;
}
if(ip_flag == 2) //deallocate (free) memeory from array
{
for(i_loop = 0; i_loop < num_row; i_loop++)
free((*ip_array)[i_loop]);
free((*ip_array));
(*ip_array) = NULL;
}
}