为什么这样 ( 看下很简单的代码)

来源:百度知道 编辑:UC知道 时间:2024/06/15 14:59:57
// Note:Your choice is C++ IDE
#include <iostream>
using namespace std;

void test( int *a)
{
memset(a, 0, sizeof(a));
}

int a[6];
int main()
{
memset(a, 0, sizeof(a));
a[2] = 128;
test(a);
cout<<a[2]<<endl;
// print: 128
return 0;
}

输出时128 , 为什么不能在函数里memset传入的数组地址
为什么直接在main函数就可以
memset(a, 0, sizeof(a));
把整个数组置0

你错了
你说的都没错,很感谢
我不懂的是为什么
int a[6];
int main()
{
a[2] = 128;
memset(a, 0, sizeof(a));
cout<<a[2]<<endl;
// print is:0
return 0;
}
这样输出的是0(这样memset作用在整个数组上), 而我上面那个在函数里的memset好像只会作用在 a[0]上

memset函数的第三个参数错误,应改为如下:

memset(a, 0, 6*sizeof(int));

你直接在main函数里用也不可以。之所以他输出0并不是因为你用了memset(a, 0, sizeof(a));的作用,而是因为你定义的a数组为全局变量,定义好后所有元素默认都是0,你可以把main函数内的那个memset注释掉,结果仍然是0 .

虽然用memset可以快速置换所有元素为0,但是如果为int型数组建议用for循环一个一个赋值,不要使用memset,因为memset是以字节为单位对数组元素赋与ASCII值,标准c++里int变量为4个字节。假设你把1赋int型数组的每个元素而不是0的话,1转为二进制是00000001,只占了1个字节,其他3个字节也要被同样填充为00000001,4个字节的变量合起来就是:1000000010000000100000001,这样就变成16843009,所以除了置0外,你用memset置换成任何数都是错的。

总结起来一句话:memset只适用于每个元素只占1个字节的数组,比如char型数组。

有错误请明确指出,互相学习。

楼上解释完全正确,是楼主错了。。。

就像楼上那兄弟说的那么改就行了。你的memset函数的第三个参数用错了。改了之后就可以置0了,下面完整代码:

#include<iostream>
using namespace std;

void test( int *a)
{
memset(a, 0, 6*sizeof(int)); //注意改这里
}

int a[6];
int main()
{

a[2] = 128;
test(a);
cout<<a[2]<<endl;
// print is:0
system("pause");
return 0;
}