C++中memset的意外行为

lokaqttq  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(112)

我注意到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)那么为什么第二个不一样,为什么有垃圾值?

waxmsbnn

waxmsbnn1#

int dp[5];

dp声明为5个整数的数组,即int[5]。这里dp不是指针。它是一个数组。数组不是指针。sizeof dp5 * sizeof int
另一方面,这:

int* dp = ... whatever ...;

dp声明为指向int的指针,即int*sizeof dpint*
重要提示:指针不是数组,数组也不是指针。这里的dp与上面的dp非常不同。这里dp是指向单个int的指针,它是动态分配数组的第一个元素。
dp是一个指针时,则dp[0]等价于*(dp + 0),因此5 * sizeof dp[0]是当dp指向一个具有5整数的数组的第一个元素时数组的总大小。
考虑一下:

#include <iostream>

int main() {
    std::cout << sizeof(int) << "\n";
    std::cout << sizeof(int*) << "\n";
    std::cout << sizeof(int[5]) << "\n";
}

Possible output is

4
8
20

这里,整数的大小是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的使用:

std::vector<int> x(5);
std::cout << "number of elements: " << x.size();

相关问题