学习积累

1.结构体的用法

typedef struct tagNode

{

  char *pItem;

  pNode pNext;

}*pNode;

当用上面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?

答案与分析

  C语言当然允许在结构中包含指向它自己的指针,我们可以在建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用。

  根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。

 解决这个问题的方法有多种:

1)、

typedef struct tagNode   
{  
  char *pItem;  
  struct tagNode *pNext;  
} *pNode;   

2)、

typedef struct tagNode *pNode;  

struct tagNode   

{   

  char *pItem;   

  pNode pNext;  

};   

注意:在这个例子中,你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。

3)、规范做法:

struct tagNode  

{   char *pItem;   

  struct tagNode *pNext;

 };  

typedef struct tagNode *pNode;  

 

2.一般在使用ubuntu的时候,选择源的时候进入ubuntu软件中心,选择编辑->软件源(s)...->ubuntu软件,下载自:中国服务器改为http://mirror.lupaworld.com/ubuntu

 

3.将windows的fat32盘挂到linux下

Linux将系统中所有的设备都看做文件,所以在Linux下访问Windows分区非常方便,只要使用mount命令将Windows分区挂载成Linux的一个文件夹即可。
mount命令的使用格式是(必须以 root 用户身份登陆):

#mount [-afFhnrvVm] [-|<标签>] [-o<选项>] [-t<文件系统>] [设备名称] [挂接点]

若我们要将Windows的某一分区(如D盘)挂载到Linux的/mnt/win这个目录下,首先要在/mnt下建立win文件夹,然后输入命令

#mount /dev/hda5 /mnt/win

再进入/mnt/win目录,你就能看到Windows中D盘的内容了。
不过用上面的方法挂载Windows分区后,很可能会出现另一个麻烦的事情,就是Windows中所有的中文文件名和文件夹名全部显示为问号(?),英文却能正常显示。要解决这个问题,只要在mount命令中加入一些参数让它正确显示中文。将上述命令改为:

#mount -t vfat -o iocharset=cp936 /dev/hda5 /mnt/win

加载了这个分区,在不使用时我们还可以将它卸除,而卸除的命令为umoun。若是卸除上述分区,只需要输入:

#umount /mnt/win


另外,我们还可以让Linux在启动时自动加载分区,这样就不用每次使用Windows分区时都要输入命令加载了。
首先,以root用户登陆,编辑/etc/fstab文件,在最后添加如下一行:

/dev/hda5 /mnt/win vfat codepage=936,iocharset=cp936 0 0

然后在/mnt目录下建立win文件夹,重新启动计算机后,再访问/mnt/win目录就是Windows分区的内容了。当然,你也可以通过此种方法加载多个分区。

4.有无法连接的动态库

第一步:确认有哪些Lib无法Load 
>ldd move_db 
linux-gate.so.1 => (0x0089c000) 
libmysqlclient.so.15 => not found 
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00cfa000) 
libm.so.6 => /lib/libm.so.6 (0x00804000) 
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x009f8000) 
libc.so.6 => /lib/libc.so.6 (0x0069e000) 
/lib/ld-linux.so.2 (0x0067b000) 
 
第二步:系统要确认动态库的地址,把动态库的路径放到/etc/ld.so.conf中 
建议:在/etc/ld.so.conf.d/上新建动态库相应的文件配置文件*.conf, 
在该文件中填上该动态库的绝对路径 
此例: 
vim /etc/ld.so.conf.d/ld.mysql.so.conf 
/usr/local/mysql/lib 
 
第三步:运行ldconfig重建/etc/ld.so.cache
 
5.在python脚本编写的时候遇到:IndentationError:unindent does not match any other indentation level

应该是缩进问题,特别是把几个不同的源码拷到一块修改调式的时候容易遇到,因为两个人写的程序缩进可能不一样,有的是tab,有的是空格,这用肉眼很难察觉。把缩进都改为一种格式就可以了。

 

6.typedef与#define的比较

typedef比#define好,特别在有指针的场合

根本原因:#define只是简单地字符串替换而typedef则是为一个类型起新名字。

例:

二者修饰指针类型时,作用不同。
Typedef int * pint;
#define PINT int *
 
Const pint p;//p不可更改,p指向的内容可以更改,相当于 int * const p;
Const PINT p;//p可以更改,p指向的内容不能更改,相当于 const int *p;或 int const *p;

pint s1, s2; //s1和s2都是int型指针
PINT s3, s4; //相当于int * s3,s4;只有一个是指针

 

 

posted @ 2013-08-23 17:12  万载一梦  阅读(131)  评论(0编辑  收藏