(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) |