Q:

Função recebe como parâmetro um vetor de strings

Comecei à pouco tempo a aprender a linguagem de programação C e estou com dificuldades.
Declaro um vetor de strings, passo valores para esse vetor e de seguida passo esse mesmo vetor como argumento de uma função. O problema é aqui, quando corro o programa e no momento em que passo o vetor de strings como argumento, ele simplesmente deixa de funcionar.
Deixo aqui um exemplo de código, para verem como estou a fazer:
#include <stdio.h>
#include <stdlib.h>
void MostraTodos(char memoria[]);

int main(int argc, char *argv[]) {
    char memoria[3][30];
    int i;
for(i=0;i<3;i++){
    printf("Introduza o seu nome\n");
    scanf("%s", &memoria[i]);
    }

MostraTodos(memoria);
return 0;
}

void MostraTodos(char memoria[]){
    int i;
    for(i=0; i<3; i++){
        printf("%s", memoria[i]);
    }

}

Já pesquisei bastante e não encontro a resposta, ainda por cima penso que seja fácil de resolver.

A:

Um dos motivos do erro é achar que existem strings em C. Na verdade existe array de char terminado com um nulo. Se conceituar isso corretamente fica mais fácil entender. Então tem dois erros, na verdade, o mesmo em dois lugares.
Um deles é que está parametrizando a função para receber um vetor de char, mas o que deseja é um vetor de vetores de 30 chars. Então isso é o que tem que usar no parâmetro.
O outro erro é que está passando para o scanf() um ponteiro o elemento do vetor quando deseja passar um ponteiro para o endereço onde começa o vetor de char de cada elemento, portanto tem que passar o elemento 0 deste vetor.
#include <stdio.h>

void MostraTodos(char memoria[][30]) {
    for (int i = 0; i < 3; i++) printf("%s\n", memoria[i]);
}

int main() {
    char memoria[3][30];
    for (int i = 0; i < 3; i++) {
        printf("Introduza o seu nome\n");
        scanf("%s", &memoria[i][0]);
    }
    MostraTodos(memoria);
}

Veja funcionando no ideone. E no repl.it. Também coloquei no GitHub para referência futura.

