2012-03-25 2 views
1

Я пытаюсь закодировать функцию, которая генерирует N число матриц 3x3 (алгоритм рекурсивного удвоения). Следующий код вызывает ошибку.Ошибка при использовании свободной команды в C

#define N 4 

#include<stdio.h> 
#include<stdlib.h> 

void CReduce(double*,double*,double*,double*,double*); //Cyclic reducer 

int main() 
{ 
    double *a,*b,*c,*d,*x; 
    int size = N*sizeof(double); 
    int i; 

    a = (double*)malloc(size); 
    b = (double*)malloc(size); 
    c = (double*)malloc(size); 
    d = (double*)malloc(size); 
    x = (double*)malloc(size); 

    //assign vector values-change later 
    for(i=0;i<N;i++) 
    { 
     b[i] = 2.0; 
     a[i] = c[i] = -1.0; 
     d[i] = 0.0; 
    } 
    d[N-1] = 1.0; 
    a[0] = 1.0; 
    c[N-1] = 1.0; 

    CReduce(a,b,c,d,x); 

    //for(i=0;i<N;i++) printf("%d %lf\n",i,x[i]); 

    free(a); 
    free(b); 
    free(c); 
    free(d); 
    free(x); 

    return 0; 
} 

void CReduce(double* a,double* b,double* c,double* d,double* x) 
{ 
    double *B,*C; 
    int i; 

    B = (double*)malloc(N*3*3); 
    C = (double*)malloc(N*3*3); 

    a[0] = 1.0; 
    c[N-1] = 1.0; 

    for(i=0;i<N*3*3;i++) B[i]=C[i]=0.0; 

    free(B); 
    free(C); 
} 

Я не полностью закончил код, но при запуске кода он уже производит следующую ошибку.

*** glibc detected *** ./a.out: free(): invalid next size (fast): 0x00000000023f4100 *** 

Может ли кто-нибудь вести меня о том, какую ошибку я делаю? Спасибо.

ответ

2

Это неправильно.

B = malloc(N*3*3); 

Это право.

B = malloc(sizeof(*B)*N*3*3); 

Обратите внимание, что (double *) является излишним, он просто занимает место на экране.

других ответов есть хорошие советы, они были downvoted но когда N мала ваша программа не имеет никаких оснований использовать malloc. Если вы не знаете, что N собирается получить большой, а затем удалить malloc с вашего кода. Здесь проще.

+1

+1: также обратите внимание, что выдача результата malloc больше, чем просто лишняя, он может маскировать потенциально полезные предупреждения компилятора –

+1

'(double *)' не лишний, он делает код C++ совместимым! – vsz

+3

@vsz, совместимость кода между C и C++ полна подводных камней, это один. Единственное, что надежно работает, - совместимость интерфейса. C++ - это другой язык, выделение в C++ должно выполняться с помощью 'new'. –

0

Я не уверен, где проблема, но действительно ли вам нужно использовать динамическое распределение? Ваш N постоянный, поэтому вы можете написать

double a[N]; 
double b[N]; 
double c[N]; 
double d[N]; 
double x[N]; 
+2

Что происходит, когда N является гораздо большим значением? –

+0

Это правда, что теоретически можно использовать все пространство стека, но поскольку нам нужно 3x3, это едва ли проблема. Во всяком случае, thx для указания этого, +1 ... – tchap

0

Я хотел бы добавить предложение. Посмотрите на свой CReduce функции -

B = (double*)malloc(N*3*3); 
C = (double*)malloc(N*3*3); 

............ 

free(B); 
free(C); 

Всякий раз, когда вы видите, выделение памяти и выделение памяти в одной и той же функции, вы должны рассмотреть возможность удаления динамического распределения и использования простых массивов, вместо которых будут делать ту же работу лучше -

double B[N*3*3]; 
double C[N*3*3]; 

Но есть определенные ограничения на размеры массивов в зависимости от платформ, компиляторов и т. Д. Некоторые из них сообщают об ошибках, если длина массива довольно велика в объявлении. Поэтому, если вам нужен действительно большой массив (например, более 100000 элементов), возможно, динамическое распределение будет единственным способом.

+0

Это не может быть хорошим советом - что, если он хочет использовать большие значения N? –

+0

@PaulR: пример, который он использует, это не для большого количества воспоминаний, но только для небольшой суммы. Тем не менее, я включу вашу озабоченность в ответ. –

+1

@SayemAhmed: Кто-то уже прокомментировал это сообщение, давая возражение, downvoter может просто согласиться с этим чувством или может быть фактически одним и тем же человеком. Downvotes не являются общедоступными. –

Смежные вопросы