【问题标题】:Passing pointers and allocating memory results in segfault传递指针和分配内存会导致段错误
【发布时间】:2014-07-03 06:53:58
【问题描述】:

我正在编写一个 C 程序,但在使用指针和正确分配内存时遇到了一些问题。这是我的代码:

void read_file(char* file_name, float***** data, unsigned char**** flagged, 
              unsigned char**** initial_flagged)
{
  int nr_stations;
  int nr_times;
  int nr_subbands;
  int nr_subbands_in_file;
  int nr_channels;
  int nr_polarizations;
  int i,j,k;
  int err;

  /*Unnecessary code omitted*/


 //allocate memory for data and flags.

  *data = (float****) malloc(sizeof(float***) * nr_times);
  if(*data == NULL){
    perror("Error allocating memory for data buffer:");
    exit(1);
  }
  *flagged = (unsigned char***) malloc(sizeof(unsigned char **) * nr_times);
  if(*flagged == NULL){

    perror("Error allocating memory for flag buffer:");
    exit(1);
  }
  *initial_flagged = (unsigned char***) malloc(sizeof(unsigned char **) * nr_times);
  if(*initial_flagged == NULL){
    perror("Error allocating memory for flag buffer:");
    exit(1);
  }

  for(i=0;i<nr_times;i++){
    *data[i] = (float ***) malloc(sizeof(float**) * nr_subbands);
    if(*data[i] == NULL){
      perror("Error allocating memory for data on time");
      exit(1);
    }
    *flagged[i] = (unsigned char **) malloc(sizeof(unsigned char *) * nr_subbands);
    if(*flagged[i] == NULL){
      perror("Error allocating memory for flags on time");
      exit(1);
    }
    *initial_flagged[i] = (unsigned char **) malloc(sizeof(unsigned char *) 
    * nr_subbands);
    if(*initial_flagged[i] == NULL){
      perror("Error allocating memory for initial_flags on time");
      exit(1);
    }

    for(j=0;j<nr_subbands;j++){
      *data[i][j] = (float **) malloc(sizeof(float*) * nr_polarizations);
      if(*data[i][j] == NULL){
        perror("Error allocating memory for data on subband at time");
        exit(1);
      }

      for(k=0;k<nr_polarizations;k++){
        *data[i][j][k] = (float *) malloc(sizeof(float) * nr_channels);
        if(*data[i][j][k] == NULL){
          perror("Error allocating memory for data on on polarization on subband at time ");
          exit(1);
        }
        memset(*data[i][j][k], 0, sizeof(float) * nr_channels);
      }
      *flagged[i][j] = (unsigned char*) malloc(sizeof(unsigned char) * nr_channels);
      if(*flagged[i][j] == NULL){
        perror("Error allocating memory for flags on subband at time");
        exit(1);
      }
      *initial_flagged[i][j] = (unsigned char*) malloc(sizeof(unsigned char) *
      nr_channels);
      if(*initial_flagged[i][j] == NULL){
        perror("Error allocating memory for initial flags on subband at time");
        exit(1);
      }
      memset(*flagged[i][j], 0, sizeof(unsigned char) * nr_channels);
      memset(*initial_flagged[i][j], 0, sizeof(unsigned char) * nr_channels);
    }
  }

int main(int argc, char** argv){
  float**** data = NULL;
  unsigned char*** flagged = NULL;
  unsigned char*** initial_flagged = NULL;

  if(argc != 2){
    printf("Usage: flagger <filename>\n");
    exit(1);
  }

  read_file(argv[1], &data, &flagged, &initial_flagged); 
  printf("data = %p\n", data);
  return 0;


}

当我运行这段代码时,它在

处出现段错误

*data[i][j][k] = (float *) malloc(sizeof(float) * nr_channels);

但是,当我不将指向数据、标记或 initial_flagged 的​​指针传递给方法但在函数范围内声明它们时,这工作正常,但我不能在函数之外使用这些数组。

【问题讨论】:

  • float*****,这是我第一次看到五颗星。
  • @YuHao 有没有更好的方法来传递四维数组? :)
  • @Linus 常识、structstypedef、使用索引更好的一维数组等......

标签: c pointers segmentation-fault malloc


【解决方案1】:

在 C 中,解引用运算符(即 *)的级别或优先级低于数组下标运算符(即 [])。

因此,操作*data[i][j] 等价于*(data[i][j])。在您的程序中,它导致了段错误,因为它将data[i][j] 的值解释为地址,并试图访问存储在该地址的数据,而实际上它是一个浮点数。

因此,在这种情况下,您必须使用括号,例如 (*data)[i][j]

C/C++ Operator Predecence

【讨论】:

    【解决方案2】:

    好的,所以我自己想通了(我猜是橡皮鸭调试)。 显然 *data[i][j] 和 (*data)[i][j] 是有区别的。第二个就是我的意思,让我的代码正常运行!

    【讨论】:

      猜你喜欢
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多