我注意到memset()
在与动态数组一起使用时的意外行为。
// This works well, sets value of each index = 0
int dp[5];
memset(dp, 0, sizeof(dp));
// This one doesn't work as expected, there are garbage values at some indexes
int *dp = new int[5];
memset(dp, 0, sizeof(dp));
// And this one works as expected
int *dp = new int[5];
memset(dp, 0, sizeof(dp[0]) * n);
这种意外行为的原因是什么?
编辑:
我知道sizeof(dp)
给出了指针的大小,而sizeof(dp[0])
给出了dp[0]
的大小。我主要关心的是,如果第一个是工作正常的指针大小,即。sizeof(dp)
那么为什么第二个不一样,为什么有垃圾值?
1条答案
按热度按时间waxmsbnn1#
这
将
dp
声明为5个整数的数组,即int[5]
。这里dp
是不是指针。它是一个数组。数组不是指针。sizeof dp
是5 * sizeof int
。另一方面,这:
将
dp
声明为指向int
的指针,即int*
。sizeof dp
是int*
。重要提示:指针不是数组,数组也不是指针。这里的
dp
与上面的dp
非常不同。这里dp
是指向单个int
的指针,它是动态分配数组的第一个元素。当
dp
是一个指针时,则dp[0]
等价于*(dp + 0)
,因此5 * sizeof dp[0]
是当dp
指向一个具有5
整数的数组的第一个元素时数组的总大小。考虑一下:
Possible output is:
这里,整数的大小是4,而指向整数的指针的大小是8。这些数字可以不同,但是5个整数的数组的大小总是
5 * sizeof(int)
,并且通常sizeof(int*)
比sizeof(int[5])
小得多。关于你的编辑...
我主要关心的是,如果第一个是工作正常的指针大小,即。sizeof(dp)那么为什么第二个不一样,为什么有垃圾值?
在第一个例子中,
dp
不是指针。当你把dp
声明为int dp[5];
时,dp
不是指针。它是一个数组。数组不是指针。另一方面,int* dp = ...
声明dp
作为整型指针。PS:使用vector而不是手动管理的c-阵列,并跳过
memset
的使用: