1.以memset函数举例说明吧!
#include <mem.h>
void test_memset()
{
printf("set int to 0\n");
int a[] = {1,2,3,4,5};
//int length = sizeof(a)/sizeof(int);//不能使用sizeof(c)/sizeof(int)
int length = sizeof(a);
int i = 0;
for(i=0;i<5;i++)
{
printf("a[%d] = %d\n",i,a[i]);
}
printf("--test_memset--\n");
memset(a,0,length);//都设置为0
for(i=0;i<5;i++)
{
printf("a[%d] = %d\n",i,a[i]);
}
printf("set char to 0\n");
char c[] = {'1','2','3','4','5'};
//int length = sizeof(c)/sizeof(int);//不能使用sizeof(c)/sizeof(int)
length = sizeof(c);
for(i=0;i<5;i++)
{
printf("c[%d] = %c\n",i,c[i]);
}
printf("--memset--\n");
memset(c,0,length); //0x00 --> a
for(i=0;i<5;i++)
{
printf("c[%d] = %c\n",i,c[i]);
}
}
输出:
我自己写的memset函数,函数原型为:void* myMemset0(void* arr,char v,unsigned int size);
void* myMemset0(void* arr,char v,unsigned int size)
{
printf("--myMemset0--\n");
void* ret = arr;
char* dest = (char*)arr;
int i = 0;
for(i=0;i<size;i++)
{
dest[i] = v;
//printf("dest[%d] = %d\n",i,dest[i]);
}
return ret;
}
void test_myMemset0()
{
printf("set int to 0\n");
int a[] = {1,2,3,4,5};
//int length = sizeof(a)/sizeof(int);
int length = sizeof(a);
int i = 0;
for(i=0;i<5;i++)
{
printf("a[%d] = %d\n",i,a[i]);
}
printf("--test_myMemset0--\n");
myMemset0(a,0,length);//都设置为0
for(i=0;i<5;i++)
{
printf("a[%d] = %d\n",i,a[i]);
}
//--------------
printf("set char to 0\n");
char c[] = {'1','2','3','4','5'};
//length = sizeof(a)/sizeof(int);
length = sizeof(c);
for(i=0;i<5;i++)
{
printf("c[%d] = %c\n",i,c[i]);
}
printf("--test_myMemset0--\n");
myMemset0(c,0,length);//都设置为0
for(i=0;i<5;i++)
{
printf("c[%d] = %c\n",i,c[i]); //0x00 --> a
}
}
输出:
发现结果是一模一样的,也就是说,当使用memset函数,对数组(连续的内存区域)进行写0操作时,使用length = sizeof(c);而不能使用length = sizeof(a)/sizeof(int);
如果使用memset函数,对数组(连续的内存区域)进行写非零的数值时,如memset(a,1,length);发现输出数组的结果并不是我们想要的。
原因有两个:
1>由于memset中传进的length可能是length = sizeof(c);而不是length = sizeof(a)/sizeof(int);
2>memset中,char* dest = (char*)arr;(以我自定义的函数myMemset0为例),强制转化的类型不一致造成的,这个是最主要的。
因此想要对数组(连续的内存区域)进行写非零的数值时,需要改写memset函数,并且,对char数组的使用和对int数组的使用是不同,因为函数内部的类型因char或int不一样而有所改动。
A: 针对int数组
#include <stdio.h>
#include <mem.h>
void* myMemsetNum(void* arr,int v,unsigned int size)
{
printf("--myMemsetNum--\n");
void* ret = arr;
int* dest = (int*)arr; //注意这里的类型转换
int i = 0;
for(i=0;i<size;i++)
{
dest[i] = v;
//printf("dest[%d] = %d\n",i,dest[i]);
}
return ret;
}
void test_myMemsetNum()
{
int a[] = {1,2,3,4,5}; //
int length = sizeof(a)/sizeof(int);
//int length = sizeof(a);
int i = 0;
for(i=0;i<5;i++)
{
printf("a[%d] = %d\n",i,a[i]);
}
printf("--test_myMemsetNum--\n");
myMemsetNum(a,7,length); //都设置为7
for(i=0;i<5;i++)
{
printf("a[%d] = %d\n",i,a[i]);
}
}
输出:
B:针对char数组
void* myMemsetChar(void* arr,char v,unsigned int size)
{
printf("--myMemsetChar--\n");
void* ret = arr;
char* dest = (char*)arr; //注意这里的类型转换
int i = 0;
for(i=0;i<size;i++)
{
dest[i] = v;
// printf("dest[%d] = %c\n",i,dest[i]);
}
return ret;
}
void test_myMemsetChar()
{
char c[] = {'a','b','c','d','e'};
int length = sizeof(c)/sizeof(char);
//int length = sizeof(c);
int i = 0;
for(i=0;i<5;i++)
{
printf("c[%d] = %c\n",i,c[i]);
}
printf("--test_myMemsetChar--\n");
myMemsetChar(c,'x',length);//都设置为'x'
for(i=0;i<5;i++)
{
printf("c[%d] = %c\n",i,c[i]);
}
}
输出:
注意
1>由于函数中传进的length是sizeof(a)/sizeof(int);而不是length = sizeof(c);
2>函数中要进行类型转换,不同的类型的数组,强制转换的类型不同,int* dest = (int*)arr;,char* dest = (char*)arr;(以我自定义的函数为例)。
总结:
**对连续内存操作时,就使用length = sizeof(c);
对数组进行操作时,就使用length = sizeof(a)/sizeof(int);**