以多少个字节为单位分配内存:
找结构体中占字节数最多的基本类型,以它的字节数为单位为结构体开辟内存。
注意:
当有double 类型成员的时候
vc中以八字节为单位开辟内存,double 类型的成员为8字节对齐
gcc 以四字节为单位开辟内存,并且double类型的成员为4字节对齐
字节对齐:
char型成员1字节对齐,即随便一个字节空间都可以存放char型数据
short型成员 2字节对齐,即存放short型成员的内存编号必须是2的倍数
int 型成员 4字节对齐,及存放int型成员的内存边行必须是4的倍数
字符串函数的实现:
/*
原型声明:char *strcpy(char* dest, const char *src);
头文件:#include <string.h> 和 #include <stdio.h>
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
*/
char * strcpy(char *dest,const char *src)
{
char *tmp = dest;
while((*dest++ = *src++) != '\0')
return tmp;
}
/*trcpy只是复制字符串,但不限制复制的数量,很容易造成缓冲溢出。strncpy要安全一些*/
char * strncpy(char *dest,const char *src,size_t count)
{
char *tmp = dest;
while(count-- && (*dest++ = *src++) != '\0')
return tmp;
}
/*
将两个char类型连接。
char d[20]="GoldenGlobal"; char *s="View"; strcat(d,s);
结果放在d中
printf("%s",d);
输出 d 为 GoldenGlobalView (中间无空格)
d和s所指内存区域不可以重叠且d必须有足够的空间来容纳s的字符串。
返回指向d的指针。
*/
char *strcat(char *dest,const char *src)
{
char *tmp = dest;
while(*dest)
dest++;
while((*dest++ = *src++) != '\0')
;
return tmp;
}
/*功能
把src所指字符串的前n个字符添加到dest所指字符串的结尾处,并覆盖dest所指字符串结尾的'\0',从而实现字符串的连接。
说明
src和dest所指内存区域不可以重叠,并且dest必须有足够的空间来容纳src的字符串。
返回值
返回指向dest的指针*/
char * strncat(char *dest,const char *src,size_t count)
{
chat *tmp = dest;
if(count)
{
while(*dest)
dest++;
while((*dest++ = *src++))
{
if(--count == 0)
{
*dest = '\0';
break;
}
}
}
return tmp;
}
/*当s1<s2时,返回为负数;
当s1==s2时,返回值= 0;
当s1>s2时,返回正数。
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。
*/
int strcmp(char *s1,char *s2)
{
while(*s1 && *s2)
{
if(*s1 - *s2)
return (*s1 - *s2);
s1++;
s2++;
}
if(*s1 != 0)
return 1;
else
return -1;
return 0;
}
/*
int strncmp ( const char * str1, const char * str2, size_t n );
str1, str2 为需要比较的两个字符串,n为要比较的字符的数目。
字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strncmp()首先将s1 第一个字符值减去s2 第一个字符值,若差值为0 则再继续比较下个字符,直到字符结束标志'\0',若差值不为0,则将差值返回。例如字符串"Ac"和"ba"比较则会返回字符"A"(65)和'b'(98)的差值(-33)。注意:要比较的字符包括字符串结束标志'\0',而且一旦遇到'\0'就结束比较,无论n是多少,不再继续比较后边的字符。
*/
int strncmp(char *s1, char *s2, int len)
{
while(len--)
{
if(*s1 && *s2)
{
if(*s1 - *s2)
return (*s1 - *s2);
s1++;
s2++;
}
else
{
if(*s1 || *s2)
return(*s1? *s1: *s2);
}
}
return 0;
}
找结构体中占字节数最多的基本类型,以它的字节数为单位为结构体开辟内存。
注意:
当有double 类型成员的时候
vc中以八字节为单位开辟内存,double 类型的成员为8字节对齐
gcc 以四字节为单位开辟内存,并且double类型的成员为4字节对齐
字节对齐:
char型成员1字节对齐,即随便一个字节空间都可以存放char型数据
short型成员 2字节对齐,即存放short型成员的内存编号必须是2的倍数
int 型成员 4字节对齐,及存放int型成员的内存边行必须是4的倍数
字符串函数的实现:
/*
原型声明:char *strcpy(char* dest, const char *src);
头文件:#include <string.h> 和 #include <stdio.h>
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
*/
char * strcpy(char *dest,const char *src)
{
char *tmp = dest;
while((*dest++ = *src++) != '\0')
return tmp;
}
/*trcpy只是复制字符串,但不限制复制的数量,很容易造成缓冲溢出。strncpy要安全一些*/
char * strncpy(char *dest,const char *src,size_t count)
{
char *tmp = dest;
while(count-- && (*dest++ = *src++) != '\0')
return tmp;
}
/*
将两个char类型连接。
char d[20]="GoldenGlobal"; char *s="View"; strcat(d,s);
结果放在d中
printf("%s",d);
输出 d 为 GoldenGlobalView (中间无空格)
d和s所指内存区域不可以重叠且d必须有足够的空间来容纳s的字符串。
返回指向d的指针。
*/
char *strcat(char *dest,const char *src)
{
char *tmp = dest;
while(*dest)
dest++;
while((*dest++ = *src++) != '\0')
;
return tmp;
}
/*功能
把src所指字符串的前n个字符添加到dest所指字符串的结尾处,并覆盖dest所指字符串结尾的'\0',从而实现字符串的连接。
说明
src和dest所指内存区域不可以重叠,并且dest必须有足够的空间来容纳src的字符串。
返回值
返回指向dest的指针*/
char * strncat(char *dest,const char *src,size_t count)
{
chat *tmp = dest;
if(count)
{
while(*dest)
dest++;
while((*dest++ = *src++))
{
if(--count == 0)
{
*dest = '\0';
break;
}
}
}
return tmp;
}
/*当s1<s2时,返回为负数;
当s1==s2时,返回值= 0;
当s1>s2时,返回正数。
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。
*/
int strcmp(char *s1,char *s2)
{
while(*s1 && *s2)
{
if(*s1 - *s2)
return (*s1 - *s2);
s1++;
s2++;
}
if(*s1 != 0)
return 1;
else
return -1;
return 0;
}
/*
int strncmp ( const char * str1, const char * str2, size_t n );
str1, str2 为需要比较的两个字符串,n为要比较的字符的数目。
字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strncmp()首先将s1 第一个字符值减去s2 第一个字符值,若差值为0 则再继续比较下个字符,直到字符结束标志'\0',若差值不为0,则将差值返回。例如字符串"Ac"和"ba"比较则会返回字符"A"(65)和'b'(98)的差值(-33)。注意:要比较的字符包括字符串结束标志'\0',而且一旦遇到'\0'就结束比较,无论n是多少,不再继续比较后边的字符。
*/
int strncmp(char *s1, char *s2, int len)
{
while(len--)
{
if(*s1 && *s2)
{
if(*s1 - *s2)
return (*s1 - *s2);
s1++;
s2++;
}
else
{
if(*s1 || *s2)
return(*s1? *s1: *s2);
}
}
return 0;
}