初始化:普通数组 vs 指针数组 => sizeof, memset

原创 2012年03月29日 11:06:18
   typedef TYPE;

   TYPE * pArray = new TYPE[100];
   memset(pArray, 0, 100*sizeof(TYPE));
   //memset(pArray, 0, sizeof(pArray)); //error, output: sizeof(pArray) = 4;

   TYPE tArray[100];
   memset(tArray, 0, sizeof(tArray)); //memset(&tArray, 0, sizeof(tArray)) is also Ok!


Attention ! :::::

memset是按字节来设置的,也就是,00000000,比如下面的问题:

【摘自:http://www.cnblogs.com/fengyuehan/archive/2012/02/03/memset.html

memset相信总是用c的童鞋不会陌生

百度百科给的定义是:将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。

原先我总是以为memset是初始化数组的最好方式,比for帅得多,直到最近做了一道题才发现不是这样的。。

比如:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {

    int a[5];
    int i;
    memset(a,2,sizeof(a));
    for(i=0;i<5;i++)
    {
        printf("%d \n",a[i]);
    }
    return (EXIT_SUCCESS);
}

运行结果;


 

memset是把每个字节的全部内容替换成2,于是int的4个字节(不同编译器可能不一样)就替换成了

00000010 00000010 00000010 00000010 了,把它换成十进制后就成了2^1+2^9+2^17+2^25

我算数差,只能靠程序了,代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char** argv) {

    printf("%lf",pow(2,1)+pow(2,9)+pow(2,17)+pow(2,25));
    return (EXIT_SUCCESS);
}

运行结果:


而0和-1还是可以用memset的,因为0补完了就是 00000000 00000000 00000000 00000000 还是0

                  -1是 11111111 11111111 11111111 11111111  还是-1

代码:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {

    int a[5],b[5];
    int i;
    memset(a,-1,sizeof(a));
    memset(b,0,sizeof(b));
    for(i=0;i<5;i++)
    {
        printf("%d    %d\n",a[i],b[i]);
    }
    return (EXIT_SUCCESS);
}

运行结果:

结论:memset在初始化int类型数据时,只能初始化-1和0时才能得到原值,根据定义,它应该是主要初始化字符数组的工具。


看见了吧,这就是memset的作为了。。。。。


附注:

bool flag[10];
memset(flag, false, sizeof(flag));



指针数组、数组指针、memset填充问题

函数原型 memset(dist , val,size); char test[]

结构体数组指针memset

今天是用到了结构体指针,感觉自己真的是弱爆了,应该会有很多像我一样的菜鸟,会出现这样的错我, 错误的代码是 strArry* GrientArr;  memset(GrientArr,0,si...

为什么int型的数组用memset不能清零(memset的使用规范)

问题:为什么这样用memset不能清零 #include #include int main() {    int i,a[100];    memset(a,0,100);//改mems...

老生常谈,正确使用memset

前段项目中发现一个问题,程序总是在某个dynamic_cast进行动态转换时出异常,查了半天才发现问题原来是出在memset的使用上,虽然问题本身显而易见,但当处于几十万行代码量级中时,就变得不太那么...

C++语言复习七 数组的memset初始化 void指针的用法 举例

对于数组a[10]; a则为数组的首地址,其实就是一个 指向a[0]常指针。 则可以用: *(a+1) = a[1];  *(a+n)=a[n]; 注意: 用*(a++) 表示 a[1];...

由sizeof()引出的对数组名和指针的新认识

在C++中,数组名和指针有很多类似的地方,甚至很多时候,数组名与指针可以互相替换,我也一直以为两者没什么值得注意的区别,直到看到了一道题,才发觉自己知识的匮乏。 void UpperCase(char...

sizeof求struct、指针、数组的大小

#include using namespace std; //http://blog.sina.com.cn/s/blog_48d8ae76010002g4.html /** 为什么需要字节对齐?...

内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结

堆和栈的区别     一个由C/C++编译的程序占用的内存分为以下几个部分     1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其     操作方式类...
  • cjsycyl
  • cjsycyl
  • 2011年04月06日 15:16
  • 474

字符串,字符指针和字符数组的sizeof和strlen

1 基本定义           字符是构成源程序的基本要素。每个程序都是由一系列组合在一起有意义的字符构成的。字符常量是以单引号括起来的字符表示的整数值,即该字符在计算机字符集中的整数值。字符指针...

C/C++:sizeof数组与指针

C/C++:sizeof数组与指针
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:初始化:普通数组 vs 指针数组 => sizeof, memset
举报原因:
原因补充:

(最多只允许输入30个字)