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不是当前进程中有效的为分离线程

 

posted @ 2020-12-03 09:07  一牛头  阅读(93)  评论(0编辑  收藏  举报