UNIX 编程实践教程学习笔记 (一)
来源:互联网 发布:mac电脑删office 编辑:程序博客网 时间:2024/05/16 01:36
1.
反白文字 printf("/033[7m more? /033[m"); *反白的more*/
2.
/ dev/tty . 这是键盘和显示器的设备描述文件. 向这个文件写相当
于显示在用户的屏幕上, 读相当于从键盘获取用户的输入. 即使程序的输入/输出被" < "或
" > "重定向, 程序还是可以通过这个文件与终端变换量据.
3.
UNIX的联机帮助氛围很多节,如弟1小节是关于用户命令的帮助,弟2小节是关于系统调用的帮助,弟5小节是关于配置文件的帮助
从第一行的内容who(1),可以知道这是who命令,它的小节编号是1
4.
lseek(fd,-(sizeof(struct utmp)),SEEK_CUR);
把指针往前移一个utmp结构,注意偏移量可以是负的!
5.
关于struct dirent 中d_name成员在某些系统中为1的问题。
此为伸缩型结构成员的问题,详见c primer plus中相关章节
1楼 发表于 2007-9-19 23:19
我在书中看到有以下结构描述.
struct dirent{
.......
.......
char a[1];}
其中a[1]是文件名地址.也有的书用a[255]描述.
我对此非常不解,a[1]怎么能放文件指针呢,作为字符数组,也只能够放'/0'.
请各位释疑,万分感谢.
===========================================================================
2楼 发表于 2007-9-20 09:03
QUOTE:
原帖由 liurengui 于 2007-9-19 23:19 发表
我在书中看到有以下结构描述.
struct dirent{
.......
.......
char a[1];}
其中a[1]是文件名地址.也有的书用a[255]描述.
我对此非常不解,a[1]怎么能放文件指针呢,作为字符数组,也只能够放'/0'.
请各位释 ...
一般用于一些变长的数据结构, 方便访问结构体后面的地址. 可以让最后一位为char [0] 或者是 char [1]这种类型
如:
[Copy to clipboard] [ - ]CODE:
struct dirent
{
int len;
char a[0];
};
struct dirent *fun(char *str, int len)
{
struct dirent* n = (struct dirent*)malloc(len +1 + sizeof(struct dirent));
if (!n)
return NULL;
n->len = len;
memcpy(n->a, str, len);
return n;
}
===========================================================================
3楼 发表于 2007-9-20 09:20
楼上是正解,还有一点值得说明的是.这些char a[0] 或者 char a[1] 必须作为结构体的最后一个成员.
===========================================================================
4楼 发表于 2007-9-20 11:37
QUOTE:
原帖由 web_surf 于 2007-9-20 09:20 发表
楼上是正解,还有一点值得说明的是.这些char a[0] 或者 char a[1] 必须作为结构体的最后一个成员.
个人以为, char[0]更似更值得推荐,因为这样不会增加结构的size!而且大多数情况下,更利于对齐!
===========================================================================
5楼 发表于 2007-9-20 12:35
但是字符数组长度定义成1,只能够存'/0',其他根本就存不下了。
为什么不直接定义成这样,char *a;这样不更简单.
===========================================================================
6楼 发表于 2007-9-20 12:45
使用了malloc()给其分配了空间的, 所以说它可以有存放数据的空间. 使用char *p的方法也行, 不过这个结构体要多占sizeof(char*)这么多个字节, 在有些空间比较少的领域可以使用这种方式来减少空间的使用.
===========================================================================
7楼 发表于 2007-9-20 16:46
QUOTE:
原帖由 独孤九贱 于 2007-9-20 11:37 发表
个人以为, char[0]更似更值得推荐,因为这样不会增加结构的size!而且大多数情况下,更利于对齐!
说得一点都没错,不过我有点疑惑, 既然是char [0], sizeof(struct)也没发现这个变量占用了内存空间,但还是可以访问这个变量.奇怪,晚上会去查查c99怎么定义char[0]的.
查到了, c99这样定义的
struct s
{
int a;
char b[];
};
struct ss
{
int a;
char b[1];
};
sizeof(struct s) = offsetof(struct s, b) = offsetof(struct ss, b);
===========================================================================
8楼 发表于 2007-9-20 16:54
QUOTE:
原帖由 liurengui 于 2007-9-20 12:35 发表
但是字符数组长度定义成1,只能够存'/0',其他根本就存不下了。
为什么不直接定义成这样,char *a;这样不更简单.
谁说长度为1就只能存'/0'了.malloc时扩展了size的. 而扩展的size正好在struct的尾端, 也就是说扩展的内存跟最后一个成员char p[0]的地址是相邻的. 也就是说可以通过成员char p[0]访问.
用char p[0]比char *p的好处是:
(1) 前者malloc之后不需要给p赋值,因为前者是array.
(2) 前者实现了一个动态数组的功能,如果不需要,他根本就可以不占用任何内存,而后者会占用4个字节.
===========================================================================
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhy10/archive/2008/01/25/2065278.aspx
6.
struct dirent中d_name长度问题
关键字: dirent readdir
- 在struct dirent中,数组d_name[]的长度在有的系统上是1,有的系统是255,实际长度是多少?为什么会不同?为什么不定义成char* ?
- #define _D_NAME_MAX 255
- struct dirent {
- __ulong64_t d_offset; /* real off after this entry */
- ino_t d_ino; /* inode number of entry */
- ushort_t d_reclen; /* length of this record */
- ushort_t d_namlen; /* length of string in d_name */
- char d_name[_D_NAME_MAX+1];
- };
- /* sunOS */
- typedef struct dirent {
- ino_t d_ino; /* "inode number" of entry */
- off_t d_off; /* offset of disk directory entry */
- unsigned short d_reclen; /* length of this record */
- char d_name[1]; /* name of file */
- } dirent_t;
用于变长的数据结构,方便访问后面的地址,例如:
- struct dirent
- {
- int len;
- char a[0];
- };
- struct dirent *fun(char *str, int len)
- {
- struct dirent* n = (struct dirent*)malloc(len +1 + sizeof(struct dirent));
- if (!n)
- return NULL;
- n->len = len;
- memcpy(n->a, str, len);
- return n;
- }
不用char *是因为通过malloc扩展的struct是跟最后一个成员的地址相临的,可以通过成员a[0]访问到:
(1) 前者malloc之后不需要给p赋值,因为前者是array.
(2) 前者实现了一个动态数组的功能,如果不需要,他根本就可以不占用任何内存,而后者会占用4个字节.
a[0]似乎更好一些
- UNIX 编程实践教程学习笔记 (一)
- Unix/Linux编程实践教程 笔记一
- UNIX 编程实践教程学习笔记 (一)[续,关于伸缩型数组成员]
- UNIX 编程实践教程学习笔记 (一)[续2,关于伸缩型数组成员]
- unix/linux编程实践教程------学习笔记
- UNIX 编程实践教程学习笔记 (二)
- UNIX 编程实践教程学习笔记 (二)
- UNIX 编程实践教程学习笔记 (三)
- unix/linux编程实践教程------学习笔记(第二章)
- unix/linux编程实践教程------学习笔记(三)
- unix/linux编程实践教程------学习笔记(四)
- unix/linux编程实践教程------学习笔记(五)
- Unix/Linux编程实践教程参考答案-----第二章学习笔记
- 《unix/linux编程实践教程》学习笔记:第一章概论
- 《unix/linux编程实践教程》学习笔记:第九章 shell
- 《Unix-Linux编程实践教程》读书笔记(一)
- unix/linux编程实践教程:学习stty
- UNIX Shell编程 学习笔记(一)
- ubuntu 10.04下minicom配置
- Linux信号列表
- 牛刀教程笔记—生成窗口
- Oracle 数据库监听配置
- as3:容易忽略的小错误
- UNIX 编程实践教程学习笔记 (一)
- asp.net如何实现按回车键就执行按钮的Click()事件的办法
- My97 日期控件遇到的几点问题:无法打开internet站点【转】
- 解决swfupload上传控件文件名中文乱码问题
- zoj 3323 Somali Pirates
- C#的String.Format格式化参数
- JS实现规定TextBox长度,过滤关键字
- VC绘图防止屏幕闪烁
- ubuntu 10.04 nfs配置