c trap里看到的一些东西

来源:互联网 发布:如何养淘宝小号 编辑:程序博客网 时间:2024/06/02 09:05

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.先到这里吧,饿了,吃饭去。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击