Chinaunix首页 | 论坛 | 博客
  • 博客访问: 70998
  • 博文数量: 25
  • 博客积分: 880
  • 博客等级: 准尉
  • 技术积分: 245
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-05 10:27
文章分类

全部博文(25)

文章存档

2011年(1)

2009年(2)

2008年(22)

我的朋友

分类: C/C++

2008-09-15 17:12:24

(1)关于动态内存分配:
malloc():
函数原型: void *malloc(int size);
与之对应free(): void free(void *);
C语言的标准内存分配函数:malloc,calloc,realloc,free等。
  malloc与calloc的区别为1块与n块的区别:
    malloc调用形式为(类型*)malloc(size):在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。
    calloc调用形式为(类型*)calloc(n,size):在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。
    realloc调用形式为(类型*)realloc(*ptr,size):将ptr内存大小增大到size。
    free的调用形式为free(void*ptr):释放ptr所指向的一块内存空间。
  C++中为new/delete函数。
几个注意事项:
(1)数组,指针,字符串要先初始化再使用
(2)避免野指针:a.在定义新的指针变量之后,给其赋值为:null或者0,char* p=null;或者char* p = 0;
          b.用malloc定义一段动态内存,并令指针p指向这段动态内存,然后当用free()释放这段动态内存之后,应设置:p =null;
 a,b两情况均为野指针,也就是说我们并不知道指针指向了什么,也可以成为迷途指针。

strncpy函数原型:char * strncpy(char *s1,char *s2,size_t n);
作用:将字符串s2中最多n个字符复制到字符数组s1中,返回s1的值。
注意:如果源串长度大于n,则strncpy不复制最后的'\0'结束符,所以是不安全的,复制完后需要手动添加字符串的结束符才行。

(2)strcpy和strncpy的区别- -
第一种情况:
char* p="how are you ?";
char name[20]="ABCDEFGHIJKLMNOPQRS";
strcpy(name,p); //name改变为"how are you ? "====>正确!
strncpy(name,p,sizeof(name)); //name改变为"how are you ? " ====>正确!
第二种情况:
char* p="how are you ?";
char name[10];
strcpy(name,p); //目标串长度小于源串,错误!
name[sizeof(name)-1]='\0'; //和上一步组合,弥补结果,但是这种做法并不可取,因为上一步出错处理方式并不确定
strncpy(name,p,sizeof(name)); //源串长度大于指定拷贝的长度sizeof(name),注意在这种情况下不会自动在目标串后面加'\0'
name[sizeof(name)-1]='\0'; //和上一步组合,弥补结果
================================================
总结:strcpy
源字串全部拷贝到目标字串中,包括'\0',但是程序员必须保证目标串长度足够,且不与源串重叠。
strncpy
如果目标长>=指定长>源长,则将源串全部拷贝到目标串,连同'\0'
如果指定长<源长,则将截取源串中按指定长度拷贝到目标字符串,不包括'\0'
如果指定长>目标长,错误!

例子:
(1)
int main()
{
 char p[4];
 char q[7] = "hello!";
 cout< strncpy(p,q,7);
 cout< return 0;
}
溢出,结果不确定:
int main()
{
 char p[10];
 char q[7] = "hello!";
 cout< strncpy(p,q,7);
 cout< return 0;
}
执行的很好

(2)
找错误的题目:
下面一段代码,想在调用f2(1)时打印err1,调用f2(2)时打印err4,但是代码
中有一些问题,请做尽可能少的修改使之正确。
1 static int f1(const char *errstr, unsigned int flag) {
2 int copy, index, len;
3 const static char **__err = {“err1”, “err2”, “err3”, “err4”};
4
5 if(flag & 0x10000)
6 copy = 1;
7 index = (flag & 0x300000) >> 20;
8
9 if(copy) {
10 len = flag & 0xF;
11 errstr = malloc(len);
12 if(errstr = NULL)
13 return -1;
14 strncpy(errstr, __err[index], sizeof(errstr));
15 } else
16 errstr = __err index;
17 }
18
19 void f2(int c) {
20 char *err;
21
22 swtch(c) {
23 case 1:
24 if(f1(err, 0x110004) != -1)
25 printf(err);
26 case 2:
27 if(f2(err, 0x30000D) != -1)
28 printf(err);
29 }
30 }
一个有缺陷的解决:待以后慢慢完善(VC6):
#include
#include
#include
static int f1(char **errstr, unsigned int flag)
 {
 int copy, index, len;
    static char _err[][5] = {"err1","err2","err3","err4"};
 
 if(flag & 0x10000)
 {
  copy = 1;   
 }
 index = (flag & 0x300000) >> 20;
 
 if(copy)
 {  
  len = flag & 0xF;
  *errstr = (char *)malloc(sizeof(char) * (len+1));
  
  if(0 == *errstr)
  {
   printf("err1");
   return -1;
  }
  printf("%s\n",_err[index]);
  printf("%s\n",*errstr);  
  strncpy(*errstr, _err[index], len+1);
  printf("%s\n",*errstr); 
  
  return 0;
 }
 else 
 {
  *errstr = _err[index];
  return 0;
 }
 }
 
 void f2(int c)
 {
 char *err;
 err = 0;
 switch(c)
 {
  case 1:
   if(f1(&err, 0x010004) != -1)
   {
    printf("%s\n",err);
    break;
   }
  case 2:
   if(f1(&err, 0x30000D) != -1)
   {
    printf("%s\n",err);
    break;
   }
  default: break;
 }
 free(err);
 }
 int main()
 {
  f2(1);
  printf("\n");
  f2(2);
  return 0;
 }
 
 
 
 

 
阅读(971) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~