C / C ++中的指针编译但会出现段错误

时间:2014-04-14 05:02:06

标签: c++ arrays pointers dynamic-arrays

这是我为更大的程序剪掉的代码

double *pos_x_h[224];
double *pos_y_h[224];
const double A = 1;         
const int N = 224;
double d_0;       
double alpha;     


void initialize(double nu, int rows = 16, int columns = 14) {  
    double d = 1 / double(columns);
    d_0 = d * (1 - pow(2.0, nu - 8));
    alpha = d - d_0;
    double dx = d;
    double dy = d * sqrt(3.0) / 2;

    for (int j = 0; j < rows; j++) {
        for (int i = 0; i < columns; i++) {
            int n = i + j * columns;
            *pos_x_h[n] = i * dx + (j % 2) * dx / 2.0;
            *pos_y_h[n] = j * dy;
        }
    }
}

int main(int argc, char *argv[]) {
    double nu=7.5;
    int rows=16;
    int columns=14;

    initialize(nu);

return 0;
}

代码编译但它给出了一个seg错误。不明白为什么会这样。我要去看array_size吗?

2 个答案:

答案 0 :(得分:3)

使用pos_x_hpos_y_h作为指针数组似乎没有任何意义。

更改此内容:

double *pos_x_h[224];
double *pos_y_h[224];

对此:

double pos_x_h[224];
double pos_y_h[224];

而且:

*pos_x_h[n] = i * dx + (j % 2) * dx / 2.0;
*pos_y_h[n] = j * dy;

对此:

pos_x_h[n] = i * dx + (j % 2) * dx / 2.0;
pos_y_h[n] = j * dy;

如果你真的坚持使用指针数组,那么你可以使用它(除了上面的内容):

double *pos_x_h_ptr[224];
double *pos_y_h_ptr[224];
for (int n=0; n<224; n++)
{
    pos_x_h_ptr[n] = pos_x_h+n;
    pos_y_h_ptr[n] = pos_y_h+n;
}

答案 1 :(得分:1)

double *pos_x_h[224];
double *pos_y_h[224];

是指针数组,但是在没有分配内存的情况下使用它们

*pos_x_h[n] = i * dx + (j % 2) * dx / 2.0;
*pos_y_h[n] = j * dy;

可能是那样的

 pos_x_h[n] = malloc(sizeof(double));
 *pos_x_h[n] = i * dx + (j % 2) * dx / 2.0;
 pos_y_h[n] = malloc(sizeof(double));
 *pos_y_h[n] = j * dy;  

如果您需要在初始化函数之外分配内存(为什么会这样?它是init函数),您可以在main中执行此操作

  int i = 0;
  for(;i< 224;++i)
  {
      pos_x_h[i] = malloc(sizeof(double));
      pos_y_h[i] = malloc(sizeof(double));
  }