user-0 提问: c语言编写有限元程序，二维数组指针问题和总体矩阵合成问题，见100,101行标注

回复:
user: user-1
content: 建议不释放内存，而是重新利用上次分配的 最好循环外边分配释放 把二级指针传递到函数里面使用就好 你这里，没有必要反复分配释放 除非每次分配的内存大小不一致，不建议反复分配释放

user: user-2
content: 搜“内存池”

user: user-0
content: 引用 11 楼 lm_whales的回复:建议不释放内存，而是重新利用上次分配的 最好循环外边分配释放 把二级指针传递到函数里面使用就好 你这里，没有必要反复分配释放 除非每次分配的内存大小不一致，不建议反复分配释放 您的意思是说每个循环指针分配的地址相同，就是改变了存储的数值，这样一个指针一共占用了5*5个double，循环一次重新赋值一次所以不用释放，是这样理解吗

user: user-0
content: 引用 4 楼 user-3 的回复:检查使用分配的内存有没越界，否则可能破坏了堆，在释放时会出错指针的释放函数调用有没有问题呢 deleteptd(T1,rows);

user: user-0
content: 引用 9 楼 lm_whales 的回复:1）内存分配，可以一次分配，永久使用 2）考虑到你的代码中很多1，2，3，4 建议 保留1234 只是要多份配 一个数组，这样改动最小，代码一致性好  建议改成这样吧： ptd = (double **)malloc(5 * sizeof(double *));     if (NULL == ptd) exit(1);     for (i = 0; i <5; i++)     {         ptd[i] = (double *)malloc(5 * sizeof(double));         if (NULL == ptd[i]) exit(1);     } 谢谢，每循环一次释放一次内存要怎样做呢，现在我可以出某一次的4*4矩阵，我希望在循环一次后重新利用这个指针再返回下一个4*4矩阵，释放T1[p][q]一共16个放在101行到119行后面可以吗，这16行编译还是出错,是不是不是因为没有释放内存引起的

user: user-3
content: 检查使用分配的内存有没越界，否则可能破坏了堆，在释放时会出错

user: user-0
content: 引用 2 楼 lm_whales 的回复:第18～22 行 for (i = 1; i <= 4; i++) //为何是1～4 不应该是 0～4吗？     {         ptd[i] = (double *)malloc(5 * sizeof(double));         if (NULL == ptd[i]) exit(1);     } 引用 2 楼 lm_whales 的回复:第18～22 行 for (i = 1; i <= 4; i++) //为何是1～4 不应该是 0～4吗？     {         ptd[i] = (double *)malloc(5 * sizeof(double));         if (NULL == ptd[i]) exit(1);     } 恩，这个我刚刚检查也发现了，掌握的知识很少，没有定义i=0返回值为1是不是就是说这一行全都是1。因为我为了四节点看着方便都从1开始计的，改过了还是不行呀出现了“ 0xC0000005:  读取位置 0xFEEEFEF6 时发生访问冲突。”

user: user-1
content: 第18～22 行 for (i = 1; i <= 4; i++) //为何是1～4 不应该是 0～4吗？     {         ptd[i] = (double *)malloc(5 * sizeof(double));         if (NULL == ptd[i]) exit(1);     }

user: user-0
content: double **function(double b1, double c1, double d1, double a2, double b2, double c2, double d2, double xi, double eta) { 	double **ptd; 	int m, n; 	int i; 	double pi = 3.1415926; 	double y = 0.25*(a2 + b2*xi + c2*eta + d2*xi*eta); 	double jacobi[3][3] = { 0 }; 	double partial_xi[5] = { 0 }; 	double partial_eta[5] = { 0 }; 	double partial_x[5] = { 0 }; 	double partial_y[5] = { 0 }; 	double deter; 	double phi[5] = { 0, 0.25*(1 - xi)*(1 - eta), 0.25*(1 + xi)*(1 - eta), 0.25*(1 + xi)*(1 + eta), 0.25*(1 - xi)*(1 + eta) }; 	double fun[5][5]; 	ptd = (double **)malloc(5 * sizeof(double *)); 	if (NULL == ptd) exit(1); 	for (i = 1; i <= 4; i++) 	{ 		ptd[i] = (double *)malloc(5 * sizeof(double)); 		if (NULL == ptd[i]) exit(1); 	} 	jacobi[1][1] = 0.25*(b1 + d1*eta); 	jacobi[1][2] = 0.25*(b2 + d2*eta); 	jacobi[2][1] = 0.25*(c1 + d1*xi); 	jacobi[2][2] = 0.25*(c2 + d2*xi); 	deter = jacobi[1][1] * jacobi[2][2] - jacobi[1][2] * jacobi[2][1];  	partial_xi[1] = -1.0 / 4 * (1 - eta); 	partial_xi[2] = 1.0 / 4 * (1 - eta); 	partial_xi[3] = 1.0 / 4 * (1 + eta); 	partial_xi[4] = -1.0 / 4 * (1 + eta); 	partial_eta[1] = -1.0 / 4 * (1 - xi); 	partial_eta[2] = -1.0 / 4 * (1 + xi); 	partial_eta[3] = 1.0 / 4 * (1 + xi); 	partial_eta[4] = 1.0 / 4 * (1 - xi); 	partial_x[1] = 1.0 / deter*(jacobi[2][2] * partial_xi[1] - jacobi[1][2] * partial_eta[1]); 	partial_x[2] = 1.0 / deter*(jacobi[2][2] * partial_xi[2] - jacobi[1][2] * partial_eta[2]); 	partial_x[3] = 1.0 / deter*(jacobi[2][2] * partial_xi[3] - jacobi[1][2] * partial_eta[3]); 	partial_x[4] = 1.0 / deter*(jacobi[2][2] * partial_xi[4] - jacobi[1][2] * partial_eta[4]); 	partial_y[1] = 1.0 / deter*(jacobi[1][1] * partial_eta[1] - jacobi[2][1] * partial_xi[1]); 	partial_y[2] = 1.0 / deter*(jacobi[1][1] * partial_eta[2] - jacobi[2][1] * partial_xi[2]); 	partial_y[3] = 1.0 / deter*(jacobi[1][1] * partial_eta[3] - jacobi[2][1] * partial_xi[3]); 	partial_y[4] = 1.0 / deter*(jacobi[1][1] * partial_eta[4] - jacobi[2][1] * partial_xi[4]); 	for (m = 1; m <= 4; m++) 	for (n = 1; n <= 4; n++) 	{ 		fun[m][n] = 2 * pi*((partial_x[m] * partial_x[n] + partial_y[m] * partial_y[n])*y + 2 * phi[m] * partial_y[n])*deter; 		ptd[m][n] = fun[m][n];  	} 	return(ptd); }  void deleteptd(double **ptd, int rows) { 	int i;  	for (i = 0; i <= rows; i++) 	{ 		free(ptd[i]); 	} 	free(ptd); }

user: user-1
content: 1）内存分配，可以一次分配，永久使用 2）考虑到你的代码中很多1，2，3，4 建议 保留1234 只是要多份配 一个数组，这样改动最小，代码一致性好  建议改成这样吧： ptd = (double **)malloc(5 * sizeof(double *));     if (NULL == ptd) exit(1);     for (i = 0; i <5; i++)     {         ptd[i] = (double *)malloc(5 * sizeof(double));         if (NULL == ptd[i]) exit(1);     }

user: user-0
content: 引用 7 楼 lm_whales 的回复:指针，有必要初始化为0（nullptr） 除非你知道怎么回事 初始化为nullptr的指针，在应用中，如果不检查是否空指针。 等于事情只作了一半，跟没初始化为零区别不大（除了释放内存） 野指针固然不可访问（指向的对象），空指针也不应该去胡乱访问 我改变了长度ptd = (double **)malloc(4 * sizeof(double *)); 	if (NULL == ptd) exit(1); 	for (i = 0; i < 4; i++) 	{ 		ptd[i] = (double *)malloc(4 * sizeof(double)); 		if (NULL == ptd[i]) exit(1); 	} 这样是不是不存在野指针了，还是说要进行 指针初始化，这个指针我希望循环使用，每次获得一个4*4数组，烦请您明示

user: user-1
content: 指针，有必要初始化为0（nullptr） 除非你知道怎么回事 初始化为nullptr的指针，在应用中，如果不检查是否空指针。 等于事情只作了一半，跟没初始化为零区别不大（除了释放内存） 野指针固然不可访问（指向的对象），空指针也不应该去胡乱访问

user: user-1
content: for (i = 0; i <= rows; i++)     {         free(ptd[i]);     }   引用 3 楼 sbl0911 的回复:[quote=引用 2 楼 lm_whales 的回复:] 第18～22 行 for (i = 1; i <= 4; i++) //为何是1～4 不应该是 0～4吗？     {         ptd[i] = (double *)malloc(5 * sizeof(double));         if (NULL == ptd[i]) exit(1);     } 引用 2 楼 lm_whales 的回复:第18～22 行 for (i = 1; i <= 4; i++) //为何是1～4 不应该是 0～4吗？     {         ptd[i] = (double *)malloc(5 * sizeof(double));         if (NULL == ptd[i]) exit(1);     } 恩，这个我刚刚检查也发现了，掌握的知识很少，没有定义i=0返回值为1是不是就是说这一行全都是1。因为我为了四节点看着方便都从1开始计的，改过了还是不行呀出现了“ 0xC0000005:  读取位置 0xFEEEFEF6 时发生访问冲突。”[/quote]    ptd[i] 没分配，是个野指针 然而 释放的时候，没有分配，也释放了 （ptd[0]）是个野指针，释放会出问题的 同样 第二行，也可能涉及野指针问题