字符串
来源:互联网 发布:淘宝小米f码 编辑:程序博客网 时间:2024/05/21 18:38
1.NULL 和NUL不同,NULL用来表示特殊的指针,通常定义为((void*)0);而NUL是一个char,定义为\0,两者不能混用
2.定议字面量时通常会将其分配在字面量小池中,这个内存区域保存了组成字符串的字符序列。
多字用到同一个字面量时,字面量池通常只有一份副本,这样会减小应用程序占用的内存。
通常认为字面量是不可变的,因此中有一份副本不会有什么问题,不过,认只有一份副本或者字面量不可变不是一种好做法,
大部分编译器有关闭字面量池的选项,一旦关闭,字面量可能生成多个副本,每个副本拥有自己的地址。
如在Xcode中:
char *tab = "sound";
*tab = 'l';
就会产生EXC_BAD_ACCESS
3.GCC用 -fwritable -strings选项来关闭字符串池,在Microsoft Visual Studio中,/GF选项会打开字符串池
4.试图用字符字面量来初始化char 指针不会起作用,因为字符字面量是int类型,这其实是尝试把整数赋给字符指针,这样会造成应用程序在解引指针时终止:
char *prefix ='x';//不合法
正确的做法是:
prefix = (char *)malloc(2);
*prefix = '+';
*(prefix +1) =0;
5.字符串在内存中的布局:
char *globalHeader = "Chapter";
char globalArrayHeader[]="Chapter";
void displayHeader(){
static char *staticHeader ="Chapter";
char *localHeader ="Chapter";
static char staticArrayHeader[] ="Chapter";
char localArrayHeader[]="Chapter";
char *heapHeader = (char *)malloc(strlen("Chapter")+1);
strcpy(heapHeader, "Chapter");
}
6.字符串排序
typedef int (fptrOperation)(constchar *,constchar *);
int compare(constchar *s1, constchar *s2){
return strcmp(s1,s2);
}
void displayNames(char *names[],int size){
for (int i=0; i<size; i ++) {
printf("%s ",names[i]);
}
printf("\n");
}
void sort(char *array[],int size,fptrOperation operation)
{
int swap = 1;
while (swap) {
swap = 0;
for (int i =0; i<size -1; i ++) {
if(operation(array[i],array[i+1])>0){
swap = 1;
char *tmp = array[i];
array[i] = array[i+1];
array[i +1] = tmp;
}
}
}
}
char *names[] = {"Bob","Ted","Carol","Alice"};
sort(names, 4,compare );
displayNames(names, 4);