我回到了另一個「爲什麼這個工作,但這不」問題。我試圖構建我的C代碼,以便能夠建立複雜性和指針結構工作,因此像C在函數中操縱「對象」
Spline *new_spline() {
\\code to set up "object" here
Spline *toReturn = malloc(sizeof(*toReturn));
if (toReturn == NULL) perror("malloc toReturn failed in new_spline()\n");
toReturn->x_vals = x_vals; \\double*
toReturn->y_vals = y_vals; \\double*
toReturn->coeffs = coeffs; \\double*
toReturn->lines = lines; \\int
toReturn->xmin = xmin; \\double
toReturn->xmax = xmax; \\double
return toReturn;
}
和等效
int free_spline(Spline *s) {
free(s->x_vals);
free(s->y_vals);
free(s->coeffs);
free(s);
s = NULL;
return 0;
}
現在功能我的問題是當我嘗試通過此函數來修改一個花鍵:
int scale_spline(Spline *spline, double scale_fac) {
double *ys = malloc(spline->lines * sizeof(*ys));
if (ys == NULL) {
printf("err in scale_spline()\n");
exit(0);
}
for (int i = 0; i < spline->lines; i++) {
ys[i] = scale_fac * spline->y_vals[i];
}
Spline *toReturn = new_spline(spline->lines, spline->x_vals, ys);
free_spline(spline);
free(ys);
*spline = *toReturn;
return 0;
}
有最初沒有誤差和修飾似乎工作,但不相關的malloc()隨後在代碼,捷威後失敗一個段錯誤。我認爲這是因爲free_spline()後跟* spline = * toReturn並沒有做我想做的事情,也就是讓這個指針指向* toReturn指向的數據。此功能的工作原理的版本是:
int scale_spline(Spline **spline, double scale_fac) {
double *ys = malloc((*spline)->lines * sizeof(*ys));
if (ys == NULL) {
printf("err in scale_spline()\n");
exit(0);
}
for (int i = 0; i < (*spline)->lines; i++) {
ys[i] = scale_fac * (*spline)->y_vals[i];
}
Spline *toReturn = new_spline((*spline)->lines, (*spline)->x_vals, ys);
free_spline(*spline);
free(ys);
*spline = toReturn;
return 0;
}
究竟爲什麼scale_spline()不好,如何修改它仍與樣條線的工作*的第一個版本?這段代碼可能有很多錯誤,所以任何批評都會受到歡迎。謝謝!
請張貼實際的代碼。 '\\'不是評論介紹人,你的意思是'//'。 – unwind
併發布*完整*示例。因爲這看起來很可疑:'toReturn-> x_vals = x_vals; \\ double *'Nevermind the'\\''comment「,'x_vals'從哪裏來? –
你'''''''免費''''''''y_vals','coeffs',但不要將它們分配到任何地方。這是一個問題。 –