868さん、早速の回答ありがとうございます。

868さんが示してくれたのは良くわかっているつもりなのですが、
じゃあ何故↓は普通に表示されるのかが良くわからないのです。

void test(char **hoge)
{
  int i;

  for (i = 0; i < 3; i++)
    hoge[i] = malloc(sizeof(char) * 5);

  strcpy(hoge[0], "piyo");
  strcpy(hoge[1], "hoge");
  strcpy(hoge[2], "foo");
}

int main(void)
{
  int i;
  char *c[3];

  test(c);
  for (i = 0; i < 3; i++)
    printf("%s\n", c[i]);

  return 0;
}