レスありがとうございます
int i[2]と宣言しても int[0]〜[2]まで3つの要素が入る訳ではなかったんですね
大目に配列のサイズを指定しておく癖になってて今までさっぱり気付きませんでした;;
とても助かりました、ありがとうございます!

もう一つ質問なのですが
多重間接参照(ポインタのポインタ)についてです

#include <stdio.h>
int main(void){
char *p, **mp, str[80];
p = str;
mp = &p;
printf("名前を入力してください: ");
gets(*mp);
printf("今日は %s さん", *mp);
return 0;
}

のgets(*mp); と printf("今日は %s さん", *mp); の*mpがどうして*mpになるのか
どうしても分かりません・・・ **mpのように書いてある他の例題もあるし、
*でも**でもどっちでもいいんじゃと思って変えてみてコンパイルしてみてもエラーでますし
色々WEBサイトで検索してみたのですがさっぱりです><
私的には、ややこしくて、こんがらがってる文字列定数がらみかな?とも思うのですが
どなたか猿にでも分かるように解説していただけませんか?
宜しくお願いしますm(_ _)m