-1
#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);         
        }            

}

これは、メモリを割り当てて 2 次元配列を作成する単純な関数です。正常にコンパイルされます。ただし、実行すると、セグメンテーション違反エラーが発生します。ここで私が間違っていることを見つけるのを手伝ってくれる人はいますか?

4

2 に答える 2

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;         
        }            

}
于 2013-03-27T22:22:24.277 に答える
0

関数内からポインターの値を変更することはできません。ポインターを使用してその内容を変更することはできますが、ポインター自体を変更して外部で使用できることを期待することはできません。

あなたの場合、呼び出しip_flag==0は何も役に立たず、それで呼び出されるとip_flag==1セグメンテーション違反になります。

可能な解決策:

  • マクロを使ってみる
  • またはip_array = malloc(sizeof(double *) * num_row);関数の外側に変更しますallocate_double2d_array
于 2013-03-27T20:35:48.310 に答える