标签:访问冲突 sig 组元 指针类型 struct asc 一段 数组初始化 wiki
void *memset(void *s, int ch, size_t n);
extern void *memset(void *buffer, int c, int count)
memset(a,0,20*sizeof(char));
memset(a,20*sizeof(char),0);
1 char buffer[4];
2 memset(buffer,0,sizeof(char)*4);
3 strcpy(buffer,"123");
4 //"123"中最后隐藏的‘\0‘占一位,总长4位。
1 char buffer[20];
2 memset(buffer,0,sizeof(char)*20);
3 memcpy(buffer,"123",3);
4 //这一条的memset并不多余,memcpy并没把buffer全部覆盖,如果没有memset,
5 //用printf打印buffer会有乱码甚至会出现段错误。
6 //如果此处是strcpy(buffer,"123");便不用memset,
7 //strcpy虽然不会覆盖buffer但是会拷贝字符串结束符
第五:
1 int some_func(struct something *a)
2 {
3 …
4 …
5 memset(a,0,sizeof(a));
6 …
7 }
其实这个错误严格来讲不能算用错memset,但是它经常在使用memset的场合出现。这里错误的原因是VC函数传参过程中的指针降级,导致sizeof(a),返回的是一个something*指针类型大小的的字节数,如果是32位,就是4字节。
1 #include <iostream>
2 #include <string.h>
3 #include <afx.h>
4 using namespace std;
5 int main()
6 {
7 char buf[5];
8 CString str;
9 CString str1;
10 CString str2;
11 memset(buf,0,sizeof(buf));
12 for(int i=0;i<5;i++)
13 {
14 str.Format("%d",buf[i]);
15 str1+=str;
16 }
17 str2.Format("%d",str1);
18 cout<<str2<<endl;
19 system("pause");
20 return 0;
21 }
1 #include <iostream>
2 #include <cstring>
3 using namespace std;
4 int main()
5 {
6 char a[5];
7 memset(a,‘1‘,5);
8 for(int i=0;i<5;i++)
9 cout<<a[i]<<"";
10 system("pause");
11 return 0;
12 }
而,如下程序想把数组中的元素值设置成1,却是不可行的
1 #include <iostream>
2 #include <cstring>
3 #include <windows.h>
4 using namespace std;
5 int main()
6 {
7 int a[5];
8 memset(a,1,20);
9
10
11 //也等价于memset(a,1,sizeof(a));.
12 for(int i=0;i<5;i++)
13 cout<<a[i]<<"";
14 system("pause");
15 return 0;
16 }
1 #include <string.h>
2 #include <stdio.h>
3 #include <memory.h>
4
5 int main(void)
6 {
7 char buffer[]="Helloworld\n";
8 printf("Buffer before memset:%s\n",buffer);
9 memset(buffer,‘*‘,strlen(buffer));
10 printf("Buffer after memset:%s\n",buffer);
11 return 0;
12 }
输出结果:
1 Buffer before memset:Helloworld
2
3 Buffer after memset:***********
另一种写法(C++):
1 #include<iostream>
2 #include<cstring>
3 using namespace std;
4 int main()
5 {
6 char buffer[]="Helloworld\n";
7 cout<<"Buffer before memset:"<<buffer<<endl;
8 memset(buffer,‘*‘,strlen(buffer));
9 cout<<"Buffer after memset:"<<buffer<<endl;
10 return 0;
11 }
1 int array[5]={1,4,3,5,2};
2 for(int i=0;i<5;i++)
3 cout<<array[i]<<"";
4 cout<<endl;
5
6 memset(array,0,5*sizeof(int));
7 for(int k=0;k<5;k++)
8 cout<<array[k]<<"";
9 cout<<endl;
输出的结果就是:
1 14352
2 00000
1 int array[5]={1,4,3,5,2};
2 for(int i=0;i<5;i++)
3 cout<<array[i]<<"";
4 cout<<endl;
5
6 memset(array,1,5*sizeof(int));//注意这里与上面的程序不同
7 for(int k=0;k<5;k++)
8 cout<<array[k]<<"";
9 cout<<endl;
输出的结果就是:
1 14352
2 1684300916843009168430091684300916843009
00000001000000010000000100000001
memset(&x,0,sizeof(Some));
如果是一个结构体的数组Some x[10],可以这样:
memset(x,0,sizeof(Some)*10);
Eg3.
1 int main()
2 {
3 char *s="GoldenGlobalView";
4 clrscr();
5 memset(s,‘G‘,6); //这里没有问题,可以编译运行
6 //单步运行到这里会提示内存访问冲突
7 //肯定会访问冲突,s指向的是不可写空间。
8 printf("%s",s);
9 getchar();
10 return 0;
11 }
以上例子出现内存访问冲突应该是因为s被当做常量放入程序存储空间,如果修改为 char s[]="Golden Global View";则没有问题了。
1,memset() 函数常用于内存空间初始化。如:
1 char str[100];
2 memset(str,0,100);
1 struct sample_struct
2 {
3 char csName[16];
4 int iSeq;
5 int iType;
6 };
对于变量
struct sample_struct stTest;
一般情况下,清空stTest的方法:
1 stTest.csName[0]={‘\0‘};
2 stTest.iSeq=0;
3 stTest.iType=0;
用memset就非常方便:
memset(&stTest,0,sizeof(sample_struct));
如果是数组:
structsample_struct TEST[10];
则
memset(TEST,0,sizeof(structsample_struct)*10);
标签:访问冲突 sig 组元 指针类型 struct asc 一段 数组初始化 wiki
原文地址:https://www.cnblogs.com/ybqjymy/p/12365884.html