C语言学习笔记(四)
1. char *name = malloc(20);
name = "abcdef";
这两条语句合起来会导致内存泄露,因为name先指向堆(heap),后又指向了常量区。
2.共用体所有的成员共用一段内存:
union data{
short int i;
char ch;
}share;
int a = share.ch;表示用(char)的格式解释共用体所占的空间。a.任何时刻只有一个变量。b.不能在定义的时候赋值。c.同类型的共用体变量是可以整体赋值的。d.共用体变量起作用的是最后一次存放的成员。
example:
[root@localhost test]# gcc 12_13_2.c
[root@localhost test]# ./a.out
65
[root@localhost test]# cat 12_13_2.c
#include <stdio.h>
union data
{
short int i;
char ch;
}share;
int main()
{
int a;
share.i = 65+256;
a = share.ch; //表示用(char)的格式解释共用体所占的空间
printf("%d\n",a); //结果是65
}
3.malloc()分配后不初始化数据,calloc()分配后数据初始化为零。realloc()分配后所返回的指针不一定是原来的那个指针。
4.结构体的对齐特性:
结构体内的元素具有对齐特性(一般是4字节对齐),结构体本身也有对齐特性(与其所占内存最大的那个元素的大小对齐)。而且整个结构体的长度必须是齐对齐特性的倍数。
两个同类型的结构体可以整体赋值,如
struct AnyOne a, b;
a = b; //这是可以的
5.NULL在C和C++中的定义:
#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif
6.查看堆(heap)的分配和释放:
[root@localhost test]# valgrind --tool=memcheck --leak-check=full ./a.out
7.umask的作用:将对应的位取反,若umask=022,则将组和其他用户的w权限清零。
8.判断一个变量是不是无符号数:
#define IS_UNSIGNED(a) ((a >= 0) ? (~a > 0 ? 1 : 0) : 0)
9.
[root@localhost test]# cat 12_13_4.c
#include <stdio.h>
#include <string.h>
void func(char str[50])
{
printf("%d, %d\n", sizeof(str), strlen(str));
}
int main()
{
char s[50] = "abcdefght";
func(s);
}
[root@localhost test]# gcc 12_13_4.c
[root@localhost test]# ./a.out
4, 9
[root@localhost test]#
void func(char str[50])这里的50没有任何意义。sizeof(str)这里str代表数组首元素的地址。
10.
[root@localhost test]# cat 12_13_5.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char stra[] = "HelloWorld";
char *strb = stra;
printf("%d, %d\n", sizeof(stra), sizeof(strb++)); //stra代表整个数组,11是因为要算上'\0'
printf("%d, %d\n", strlen(strb), strlen(strb++)); //参数从右到左计算
//sizeof()是个关键字,在预编译时已经计算出了大小,不做运算
}
[root@localhost test]# gcc 12_13_5.c
[root@localhost test]# ./a.out
11, 4
9, 10
[root@localhost test]#
11.
函数指针:
例如,
int func(int x); /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
指针函数:
类型标识符 *函数名(参数表)
例如,
int *f(x,y);
12.kill -l :列出所有信号
13.注意将while(1)和sleep()(睡眠)区别开来。
14.信号处理程序不可重入函数:
a.函数返回值是指针,传递给函数的参数有指针。
b.内部有malloc()或free()调用的函数。
c.使用了全局数据结构的函数。
d.实现时用了标准I/O函数。
15.alarm定时产生的误差是比较大的。settimer可以用来精确定时。