sizeof(数组名)与sizeof(类型)*(数组大小)的区别

今天在写代码时用到了memset这个函数,发现如果定义一个int型数组

a[1000000],

使用memset进行初始化的时候第一种写法程序死机,第二种就能通过:

(1) memset(a, 0, 1000000*sizeof(int))

(2) memset(a, 0, sizeof(a))

请问这是为什么?这两种写法有什么区别?

a[1000000]; //如果是vc,此行就会报错
在栈上申请1000000个整型,需要申请内存4000000字节,合3.81M
vc默认栈大小为1M,所以内存是不够的,申请不到那么多内存,所以在a[1000000];就会报错。
如果是linux,栈大小默认为8M,就可以申请那么多的整型。

对于memset的这两行是没有区别的,两行的效果是一样。

如果是函数里,数组退化成指针,那么就要用sizeof(类型)*(数组大小)
比如
void foo(int a[])
{
cout << sizeof(a); //永远是1,不管传入多少
}