簡體   English   中英

C / C ++中的指針可以編譯,但是會出現段錯誤

[英]Pointers in C/C++ compiles but gives segfault error

這是我為較大程序編寫的代碼片段

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

代碼可以編譯,但是會給出段錯誤。 無法理解為什么會這樣。 我要檢查array_size嗎?

利用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;
}
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));
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM