c trap里看到的一些东西

    技术2022-05-20  67

    1.有关指针与数组的

             a[i] 等价于 i[a]

       因为对于数组来说,除了在sizeof()时,其他时候a相当于一个const指针,而所有对数组其他的操作都是基于a指针。

     所以a[i]与i[a]一样都是a+i;

     

    2.有关sizeof与strlen的

                char b[2]={'a','b'};

          那么 sizeof(b)=2;strlen(b)=x;因为这里似乎产生了溢出。

           

    如果是 char b[20]={'a','b'};就没有这样的问题了,sizeof(b)=20*1=20,strlen(b)=2;

     

    3.有关NULL与0

             似乎有这么个说法,由0转换而来的指针绝对不能被解除应用。什么意思呢,就是说当0被赋予一个指针变量时,

    绝对不能试图访问此指针指向的内存内容。

             所以 strcmp(p,(char *)0);printf("%s",(char *)0);这样的语句是非法的。

    这是c trap上讲的,但经过我的测试,似乎没什么问题,可能现在的编译器已经屏蔽了这个问题。

     

    4.有关二维数组与指针的关系

              涉及到函数指针或数组指针了,int calendar[12][31];可以定义一个指针指向该二维数组,你可以这样定义:int **p;

    当然你也可以这样定义:int (*p)[31];但其实前者是错误的定义,显然前者指针的类型与实际不符合。

     

    5.关于指针大小的问题

              不论指针的类型是什么,指针本事的大小是固定的,具体是多少应该跟CPU有关系,即多少位机有关系,再具体点应该是跟

    地址或数据总线有关系,32bit的应该是4B。

     

    6.数组初始化列表的时候,末尾可以有多余的逗号。

               不知道这是什么原因,按我的理解,逗号本事是不占内存的,它只是编译器用来区分数组内的元素的,比方说有一个数组

    int a[10]={1,2,3,};编译器试图去了解这个数组有多少元素,1,然后碰到一个逗号,说明逗号前的这个1是其中的一个元素,

    接着是2,然后同理,到最后一个逗号时,已经确定了3个元素,此时编译器继续往下寻找,但此时,后面已经没有其他的标识,所以

    编译器理解为数据元素已经全部检查完毕,但此时如果又出现了一个逗号,即如果int a[10]={1,2,3,,};便会出现错误,因为它再一次

    出现了一个逗号,本来逗号之前应该是数据元素的,但此时这个逗号之前还是逗号,所以这个逗号不应该出现在这里,同样,即使这个

    逗号出现在1之前也是错误的。

                姑且先这么猜着吧,估计肯定是错误的,要想彻底了解是怎么回事,可能还要看下编译原理的书。

    7.关于返回值的一个说法。

     struct A

    {

              int a;

              char b;

    }

    main()

    {

    //...............}

    按书中所讲,似乎这个函数的返回值应该是struct A,这也可以理解,但我所用的编译器却似乎必须是int返回型,不知何解,

    可能是便于OS接管,也可能是其他原因,这里不去深究。

    8.关于字符串指针的问题。

    char *p = "abcd";

    char *q = p;

    //q[1]='y';

    printf("%s/n",q);

    去掉注释后,编译通过,运行出现段错误。有2种解释,其一:ANSIC 禁止对string literal修改 其二:K&R C说对字符串常量的

    修改行为是未定义的。不过仍然好像有编译器支持这种行为。

    9.两个字符串合并的一个非常好的写法。

    #include<stdio.h>#include<string.h>#include<stdlib.h>

    char *myStrcat(char *,char *);

    int main(){        char *s = "abcd";        char *t = "efgh";        char *r = myStrcat(s,t);        printf("%s/n",r);        free(r);        return 0;}

    char *myStrcat(char *s,char *t){        char *r;        r = malloc(strlen(s)+strlen(t)+1);        if(!r)        {                printf("malloc error!/n");        }        strcpy(r,s);        strcat(r,t);        return r;}10.先到这里吧,饿了,吃饭去。

     

     

     

     

     

     

     

     

     

     

     

     

     

     


    最新回复(0)