2020-12-3学习笔记
一、memset
前提:定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构。在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”。memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。它是直接操作内存空间,mem即“内存”(memory)的意思。
memset() 的作用是在一段内存块中填充某个给定的值。因为它只能填充一个值,所以该函数的初始化为原始初始化,无法将变量初始化为程序中需要的数据。用memset初始化完后,后面程序中再向该内存空间中存放需要的数据。
头文件 # include <string.h>
函数功能: 变量初始化 函数原型: void *memset(void *buffer,int a,int n) 输入函数: 1、buffer 是指针或者数组,void是要初始化的首内存的首地址,void* 型的指针变量,所以它可以为任何类型的数据进行初始化。 2、a是要初始化的变为的数据, int类型 3、n是buffer的长度,即大小 函数返回: 无
优点: memset 是对较大的数组或结构体进行清零初始化的最快方法,因为它是直接对内存进行操作的。
用法:
1、memset 函数的第三个参数 n 的值一般用 sizeof() 获取。
2、memset是以字节为单位,初始化内存块。
char data[10]; memset(data, 1, sizeof(data)); // right memset(data, 0, sizeof(data)); // right
int data[10]; memset(data, 0, sizeof(data)); // right memset(data, -1, sizeof(data)); // right memset(data, 1, sizeof(data)); // wrong, data[x] would be 0x0101 instead of 1
二、calloc
calloc在内存的 动态存储区中分配n个长度为size的连续空间
malloc 和 calloc 之间的不同点是,malloc 不会设置内存为零,而 calloc 会设置分配的内存为零。
函数功能: 分配所需的内存空间 函数原型: void *calloc(size_t n, size_t size) 输入函数: nitems -- 要被分配的元素个数。 size -- 元素的大小。 函数返回: 该函数返回一个指针,指向已分配的内存。如果请求失败,则返回 NULL。
用法:
#include <stdio.h> #include <stdlib.h> struct{ int a; void *b; }test; int main() { int i; test *buf; buf=calloc(3,sizeof(*buf)); for(i=0;i<3;i++) { printf("这时候打印出结构体内部的a要这样写:%d\n",buf[i].a); } return(0); }
三、break
break语句通常用在循环语句和开关语句中。当break用于开关语句switch中时,可使程序跳出switch而执行switch以后的语句;如果没有break语句,则会从满足条件的地方(即与switch(表达式)括号中表达式匹配的case)开始执行,直到switch结构结束。当break语句用于do-while、for、while循环语句中时,可使程序终止循环。而执行循环后面的语句,通常break语句总是与if语句联在一起。即满足条件时便跳出循环。
break 在一些计算机编程语言中是保留字,其作用大多情况下是终止所在层的循环。
1、break语句对if-else的条件语句不起作用。
2、在多层循环中,一个break语句只向外跳一层。
continue,return,break 在for循环中的作用
1、continue:跳出当前循环,即不执行continue后的语句,进入下次循环。
2、break:跳出for循环,不再进行下次循环,但可以执行for之外的语句。
3、return:跳出for循环,且不执行for之外的语句,直接跳出当前函数,返回return后的值。
四、pthread
头文件 : #include <pthread.h>pthread非linux系统的默认库, 需手动链接-线程库 -lpthread
1、pthread_join()即是子线程合入主线程,主线程阻塞等待子线程结束,然后回收子线程资源。
函数功能:pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。 函数原型: int pthread_join(pthread_t thread, void **retval); 输入参数 :thread: 线程标识符,即线程ID,标识唯一线程。 retval: 用户定义的指针,用来存储被等待线程的返回值。 函数返回 : 0代表成功。 失败,返回的则是错误号。
2、pthread_detach()即主线程与子线程分离,子线程结束后,资源自动回收。
函数功能:pthread_join()函数的替代函数,可回收创建时detachstate属性设置为PTHREAD_CREATE_JOINABLE的线程的存储空间。该函数不会阻塞父线程。pthread_join()函数用于只是应用程序在线程tid终止时回收其存储空间。
如果tid尚未终止,pthread_detach()不会终止该线程。当然pthread_detach(pthread_self())也是可以得 函数原型:int pthread_detach(pthread_t tid); 输入参数:tid:线程标识符 函数返回:pthread_detach() 在调用成功完成之后返回零。其他任何返回值都表示出现了错误。如果检测到以下任一情况,pthread_detach()将失败并返回相应的值。 EINVAL:tid是分离线程 ESRCH:tid不是当前进程中有效的为分离线程