memset函数

memset 函数

头文件: string.h

函数声明 : void *memset(void *s,int c,int n);

函数的原理 : 将s 指向内存中的某一块大小为n的字节都变成c的ASCII的数值,内存的大小由第三个变量n指定,这个函数主要是为了新申请的内存做初始化.

注:初始化的时候,这个函数是把每一块字节都变成c的ASCII的数值.


经常出现的错误:
1.memset(buffer,0,sizeof(buffer));
有人经常把,ch和n的位置弄错了.

2.过度的使用内存
memset(buffer,0,sizeof(buffer));
strcpy(buffer,"123");
...........很显然,memset这个函数是多余的,不需要这样做,无论怎么样的赋值,都会被覆盖的.

3.忘记加memset函数
memset(buffer,0,sizeof(buffer));
memcpy(buffer,"123",3)..............void *memcpy(void *dest,const void *src,size_t n);
............这个就不不是多余的,这要看 memcpy和strcpy这两个函数的不同点了,
简单的说就是这两个函数,一个是以字节赋值的,一个是拷贝字符串的字面值的.


4.memset为函数的形式参数进行初始化
void one_memset(char *p_ch){
.....
memset(p_ch,0,sizeof(p_ch));
.....
}.
........尽管我们想得很好,要给传进的字符串初始化,但是这样的初始化是不行的.
因为在vc中,指针降级的原因.最后给出的大小只是一个指针的大小.


5.不同类型的数组使用memset的结果是不一样的
int main(void){
       char ch[10] ;
       memset(ch,1,sizeof(ch));
}

int main(void){
       int a[10];
       memset(a,1,sizeof(a));
}

这两个结果是不一样的,使用的时候要注意,很多人在使用,memset函数的时候以为这个函数能为任何类型的数组赋值的,但是其实他的本质就是
通过字节来赋值的,由于字符类型的数组每一个元素都是一个字节,这样就正好给他进行了初始化,但是一个整形的数组每一个元素都是四个字节,
这样在初始化的时候,就会出现错误,结果就会变成一个很大的数字.


6.最不应该干这样使用memset函数
/*
    memset函数的测试
*/
#include<stdio.h>
#include<string.h>

int main(){
    char *s1 = "hello wrold!";
    printf("s1 = %s\n",s1);
    memset(s1,0,8);
    printf("s1 = %s\n",s1);
    return 0;
}
.......简单的说,指针指向只读区,只读区是不能改变的,如果改变就会出现段错误.
.......但是指针的本身存在于栈区.


拓展:
memset还是可以给一个结构体进行初始化的,


typedef struct node{
      int num;
      char ch[16];
}node;

一般进行的初始化
node node1;
node1.num = 0;
node1.ch = {};

使用memset函数
/*
    memset函数的使用和练习
*/
#include<stdio.h>
#include<string.h>

typedef struct node{
    int num;
    char ch[10];
}node;

int main(){
    node node_test;
    memset(&node_test,0,sizeof(node));
    printf("num = %d\n",node_test.num);
    printf("ch = %s\n",node_test.ch);
    return 0;
}



如果使用的是一个结构体的数组
/*
    memset函数的使用和练习
*/
#include<stdio.h>
#include<string.h>

typedef struct node{
    int num[10];
    char ch[10];
}node;


int main(){
    int i = 0,j = 0;
    node node_test[10];
    memset(node_test,0,sizeof(node)*10);
    for(i = 0;i < 10;i++){
        printf("ch = %s\n",node_test[i].ch);
        for(j = 0;j < 10;j++){
            printf("%d ",node_test[i].num[j]);
        }
        printf("\n");
    }
    return 0;
}







  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值