char *pchar = "hello"
这是一个字符串常量,不允许被修改
char cdata[ ]="hello"
这是一个字符串变量,可以被修改
对于一个普通的字符串常量,可以定义一个指针,来指向它,指向字符串常量的地址空间,但是如果不是指向一个具体的空间,对内存操作就会出问题,
所谓的野指针,是指并没有明确的内存指向,很危险,可能会影响到其他程序的内存空间
如
char *p;
* p = 'a';
*p并没有明确的内存指向,却进行赋值,此时程序就会出现断错误
strlen函数会计算有效字符的长度
不同于sizeof,sizeof在计算字符串时会把\n的长度也算进去
又例如
char *p = "hello";
printf("%d",sizeof(p));
这里得到的p的值为8,这里p是一个char *,使用sizeof计算的时候,得出的是计算机用多少字节来表示一个地址,这里和char 以及int没有关系,认定的是一个地址,就是用8个字节来表示
而strlen(p)得到的值是5
函数strcpy(拷贝到哪里去,从哪里拷贝)
free()函数,释放malloc所调用的内存空间,malloc所申请的内存空间是在堆上,一般的函数是在栈上,栈上会及时清零,而堆上所分配的内存空间只有在程序结束时才会被释放,所以会出现内存泄露的情况,所以要使用free()函数,来及时的释放内存
free()函数不仅用来防止内存泄漏,也用来防止悬挂指针
悬挂指针其实也是野指针的一种
使用方法free(一个指针)
如 char* p;
free(p);
一般在free(p);后面加一句p = NULL;放置p称为野指针;
有时使用malloc函数分配的内存空间会不够用,所以使用realloc,它是c库函数尝试重新调整malloc或者calloc所分配的指针所指向的内存块的大小
realloc的用法
realloc(原本扩容的指针(地址),后面是要继续增大多少)
realloc(p,newLen);newLen是基于原本的大小进行扩容。
如
char *p;
p=(char *)malloc(12);
printf("扩容前的地址%x",p);
int len = strlen("awdawdawdawda");
int newLen = len -12 +1;
realloc(p,newLen);
printf("扩容后的地址“%x",p);
strcpy(p,"awdawdawdawda");
puts("end");
memset()函数,函数原型
void *memset(void *str,int c,size_t n )
(新开辟的内存,要初始化的内容,大小)
比如清理内容:
char *p;
p = (char *)malloc(12);
memset(p,'\0',12);
将内存全部清理为0;