| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
#include<stdio.h> 
#include<malloc.h> 
#include<stdlib.h> 
void requestmall(float ***A, int n1,int n2,int n3); 
void zero(float ***H,int n1,int n2,int n3,int N); 
void freemall(float ***A,int n1,int n2); 
void plus(float ***H,float ***K,float ***Q,int n1,int n2,int n3); 
 
int main() 
{       int n1,n2,n3; 
        printf("开始执行子程序!"); 
        n1=3; 
        n2=3; 
        n3=3; 
        float ***a = NULL; 
        float ***b = NULL; 
        float ***c = NULL; 
        //requestmall(***a,n1,n2,n3); 
        requestmall(a,n1,n2,n3); 
        requestmall(b,n1,n2,n3); 
        requestmall(c,n1,n2,n3); 
        zero(a,n1,n2,n3,1); 
        zero(b,n1,n2,n3,2); 
        zero(c,n1,n2,n3,3); 
        plus(a,b,c,n1,n2,n3); 
        printf("c[3][3][3] = %f",*(*(*(c+2)+2)+2)); 
        freemall(a,n1,n2); 
        freemall(b,n1,n2); 
        freemall(c,n1,n2); 
        return 0; 
                                 //        requestmall(b***,n1,n2,n3); 
         
} 
void zero(float ***H,int n1,int n2,int n3,int N) 
{       
        int i,j,k; 
        for(i=0;i<n1;i++) 
        { 
                for(j=0;j<n2;j++) 
                { 
                        for(k=0;k<n3;k++) 
                        { 
                                *(*(*(H+i)+j)+k)=N; 
                        } 
                } 
        } 
} 
 
void plus(float ***H,float ***K,float ***Q,int n1,int n2,int n3) 
{       
        int i,j,k; 
        for(i=0;i<n1;i++) 
        { 
                for(j=0;j<n2;j++) 
                { 
                        for(k=0;k<n3;k++) 
                        { 
                                *(*(*(Q+i)+j)+k)=*(*(*(H+i)+j)+k) + *(*(*(K+i)+j)+k); 
                        } 
                } 
        } 
} 
void requestmall(float ***A,int n1,int n2,int n3) 
{ 
        int i,j,k; 
                       A=(float ***)malloc(sizeof(float **)*n1); 
         
                for(j=0;j<n1;j++) 
                        { 
                        A[i]=(float **)malloc(sizeof(float *)*n2); 
                 
                        for(k=0;k<n2;k++) 
                                { 
                                A[i][j]=(float *)malloc(sizeof(float)*n3); 
         
                                } 
                        } 
 
                 
} 
void freemall(float ***A,int n1,int n2) 
{ 
        int i,j; 
        for(i=0;i<n1;i++) 
        {  
                for(j=0;j<n2;j++) 
                        { 
                                free(A[i][j]); 
                                A[i][j]=0; 
                        } 
         
          free(A[i]); 
          A[i]=0; 
        } 
        free(A); 
} 
 
 
目前报错为segmentation fault(core dumped)  ./a.out 
 本帖最后由 jackz007 于 2021-3-18 12:55 编辑 
         这是出错现场的情形
 - 0x00000000004007ef in zero (H=0x0, n1=3, n2=3, n3=3, N=1) at x.c:43
 
 - 43                                      *(*(*(H+i)+j)+k)=N;
 
  复制代码
        问题出在调用 zero() 时,输入参数 H 的值是 NULL(也就是 0 值),从而导致访问了根本不存在内存地址。
 - int main()
 
 - {       int n1,n2,n3;
 
 - . . . . . .
 
 -         float ***a = NULL;
 
 - . . . . . .
 
 -         zero(a,n1,n2,n3,1);
 
 - . . . . . .
 
 - void zero(float ***H,int n1,int n2,int n3,int N)
 
 - {      
 
 -         int i,j,k;
 
 -         for(i=0;i<n1;i++)
 
 -         {
 
 -                 for(j=0;j<n2;j++)
 
 -                 {
 
 -                         for(k=0;k<n3;k++)
 
 -                         {
 
 -                                 *(*(*(H+i)+j)+k)=N;  // H 必须是有效的内存地址,否则,此句必然导致 Segmentation fault 错误!!!
 
  复制代码 
        如此调用 zero() 函数,焉能不错?
 
        试试我修改的版本
 - #include<stdio.h>
 
 - #include<stdlib.h>
 
  
- float *** requestmall(int n1 , int n2 , int n3)
 
 - {
 
 -         int i , j                                                                 ;
 
 -         float *** p                                                               ;
 
 -         p = (float ***) malloc(sizeof(float **) * n1)                             ;
 
 -         for(i = 0 ; i < n1 ; i ++) p[i] = (float **) malloc(sizeof(float *) * n2) ;
 
 -         for(i = 0 ; i < n1 ; i ++) {
 
 -                 for(j = 0 ; j < n2 ; j ++) {
 
 -                         p[i][j] = (float *) malloc(sizeof(float) * n3)            ;
 
 -                 }
 
 -         }
 
 -         return p                                                                  ;
 
 - }
 
  
- void freemall(float *** A , int n1 , int n2)
 
 - {
 
 -         int i , j                                                                 ;
 
 -         for(i = 0 ; i < n1 ; i ++) {
 
 -                 for(j = 0 ; j < n2 ; j ++) {
 
 -                         free(A[i][j])                                             ;
 
 -                 }
 
 -         }
 
 -         for(i = 0 ; i < n1 ; i ++) free(A[i])                                     ;
 
 -         free(A)                                                                   ;
 
 - }
 
  
- void zero(float ***H,int n1,int n2,int n3,int N)
 
 - {      
 
 -         int i , j , k                                                             ;
 
 -         for(i = 0 ; i < n1 ; i ++){
 
 -                 for(j = 0 ;j < n2 ; j ++){
 
 -                         for(k = 0 ; k < n3 ; k ++) *(*(*(H + i) + j) + k) = N     ;
 
 -                 }
 
 -         }
 
 - }
 
  
- void plus(float ***H,float ***K,float ***Q,int n1,int n2,int n3)
 
 - {      
 
 -         int i , j , k                                                                                                       ;
 
 -         for(i = 0 ; i < n1 ; i ++) {
 
 -                 for(j = 0 ; j < n2 ; j ++) {
 
 -                         for(k = 0 ; k < n3 ; k ++) *(*(*(Q + i) + j) + k) = *(*(*(H + i) + j) + k) + *(*(*(K + i) + j) + k) ;
 
 -                 }
 
 -         }
 
 - }
 
  
- int main(void)
 
 - {
 
 -         float *** a = NULL , *** b = NULL , *** c = NULL ;
 
 -         int n1 = 3 , n2 = 3 , n3 = 3                     ;
 
 -         printf("开始执行子程序!\n")                      ;
 
 -         a = requestmall(n1,n2,n3)                        ;
 
 -         b = requestmall(n1,n2,n3)                        ;
 
 -         c = requestmall(n1,n2,n3)                        ;
 
 -         zero(a,n1,n2,n3,1)                               ;
 
 -         zero(b,n1,n2,n3,2)                               ;
 
 -         zero(c,n1,n2,n3,3)                               ;
 
 -         plus(a,b,c,n1,n2,n3)                             ;
 
 -         printf("c[3][3][3] = %f\n" , *(*(*(c+2)+2)+2))   ;
 
 -         freemall(a,n1,n2)                                ;
 
 -         freemall(b,n1,n2)                                ;
 
 -         freemall(c,n1,n2)                                ;
 
 - }
 
  复制代码
        编译、运行实况
 - D:\0002.Exercise\C>g++ -o x x.c
 
  
- D:\0002.Exercise\C>x
 
 - 开始执行子程序!
 
 - c[3][3][3] = 3.000000
 
  
- D:\0002.Exercise\C>
 
  复制代码 
 
 
 |   
 
 
 
 |