字符串

来源:互联网 发布:淘宝小米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);



0 0