Reserva dinámica de memoria

Modifica el siguiente código para que el tamaño del vector x sea n (valor introducido por el usuario).

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

double sumavec(double x[], int n) {
    double s=0;
    int i;
    for (i=0; i<n; i++)
        s += x[i];
    return s;
}

int main() {
    int i,n;
    double x[?], r, r2;
    printf("Introduce el tamaño del vector: ");
    scanf("%d",&n);
    ...
    /* Inicializamos el vector x */
    for (i=0; i<n; i++)
        x[i]=i;
    /* Llamamos a la función para sumar todos los elementos de x */
    r = sumavec(x,n);
    printf("r=%g\n",r);
    /* Llamamos a la función para sumar los elementos de la segunda mitad de x */
    r2 = sumavec(&x[n/2],n-n/2);
    printf("r2=%g\n",r2);
    ...
    return 0;
}

Solución:

Hay que declarar x como un puntero, modificando la línea 14 así:

    double *x, r, r2;

Sustituimos los puntos suspensivos de la línea 17 para reservar un bloque de memoria para el vector, guardando la dirección del bloque en el puntero x:

    x = malloc(n*sizeof(double)); 
    if (x==NULL) {
        fprintf("Error: no se pudo reservar la memoria\n");
        return -1;
    }

Finalmente, sustituimos los puntos suspensivos de la línea 27, liberando el bloque de memoria apuntado por x:

    free(x);