标签:访问冲突 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