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;
}
头文件: 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;
}