2

2 つのベクトルを一緒に追加する関数を作成しようとしていますが、最初のベクトルにより多くのメモリを再割り当てしようとすると、2 番目のベクトルが収まるようにセグメンテーション違反が発生します。これがコードです

void vectorAppend(double** v1, size_t* s1, double const* v2, size_t s2){
  assert(v1 && v2 && *s1 > 0 && s2 > 0);
  (*v1) = realloc((*v1), (*s1 + s2)*sizeof(double));
  for (size_t i = 0; i < s2; i++){
    *v1[*s1+i]=v2[i];
  }
  *s1+=s2;
}

そして、これがメインから呼び出す方法です

double *v1 = vectorConstruct(3, 2);
double *v2 = vectorConstruct(3, 0);
unsigned int s = 3;
vectorAppend(&v1, &s, v2, 3);

vectorConstruct は、2 番目の引数に初期化されたベクトルへのポインターを返します。

double* vectorConstruct(size_t s, double val){
  assert(s>0);
  double *ret = malloc(s*sizeof(double));
  for(size_t i = 0; i < s;i++){
    ret[i]=val;
  }
  return ret;
}

ここで問題が見つからないようですので、回答をいただければ幸いです。

4

1 に答える 1

7
*v1[*s1+i]=v2[i];

する必要があります

(*v1)[*s1+i]=v2[i];

単項*の優先順位は驚くほど低いです。

于 2012-06-14T13:15:29.510 に答える