精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

你所不知道的C語言高級用法

開發(fā) 后端
大部分 C 程序員都以為基本的整形操作都是安全的其實不然,看下面這個例子,你覺得輸出結(jié)果是什么?

整形溢出和提升

大部分 C 程序員都以為基本的整形操作都是安全的其實不然,看下面這個例子,你覺得輸出結(jié)果是什么:

  1. int main(int argc, char** argv) { 
  2.     long i = -1; 
  3.  
  4.     if (i < sizeof(i)) { 
  5.          printf("OK\n"); 
  6.     } 
  7.     else { 
  8.          printf("error\n"); 
  9.     } 
  10.  
  11.     return 0; 

當一個變量轉(zhuǎn)換成無符號整形時,i的值不再是-1,而是 size_t的最大值,因為sizeof操作返回的是一個 size_t類型的無符號數(shù)。在C99/C11標準里寫道:

  • “If the operand that has unsigned integer type has rank greater orequal to the rank of the type of the other operand, then the operandwith signed integer type is converted to the type of the operand withunsigned integer type.”

在C標準里面 size_t至少是一個 16 位的無符號整數(shù),對于給定的架構(gòu) size_t 一般對應(yīng)long,所以sizeof(int)和size_t至少相等,這就帶來了可移植性的問題,C標準沒有定義 short, int,long,longlong的大小,只是說明了他們的最小長度,對于 x86_64 架構(gòu),long在Linux下是64位,而在64位Windows下是32位。一般的方法是采用固定長度的類型比如定義在C99頭文件stdint.h中的uint16_t,int32_t,uint_least16_t,uint_fast16_t等。

 

你所不知道的C語言高級用法

如果 int可以表示原始類型的所有值,那么這個操作數(shù)會轉(zhuǎn)換成 int,否則他會轉(zhuǎn)換成 unsigned int。下面這個函數(shù)在 32 位平臺返回 65536,但是在 16 位系統(tǒng)返回 0。

  1. uint32_t sum() 
  2.     uint16_t a = 65535; 
  3.     uint16_t b = 1; 
  4.     return a+b; 

對于char 類型到底是 signed 還是 unsigned 取決于硬件架構(gòu)和操作系統(tǒng),通常由特定平臺的 ABI(Application Binary Interface) 指定,如果是 signed char,下面的代碼輸出-128 和-127,否則輸出 128,129(x86 架構(gòu))。

  1. char c = 128; 
  2. char d = 129; 
  3. printf("%d,%d\n",c,d); 

內(nèi)存管理和分配

malloc 函數(shù)分配制定字節(jié)大小的內(nèi)存,對象未被初始化,如果 size 是 0 取決與系統(tǒng)實現(xiàn)。malloc(0)返回一個空指針或者 unique pointer,如果 size 是表達式的運算結(jié)果,確保沒有整形溢出。

  • “If the size of the space requested is 0, the behavior isimplementation- defined: the value returned shall be either a nullpointer or a unique pointer.”
  1. size_t computed_size; 
  2.  
  3. if (elem_size && num > SIZE_MAX / elem_size) { 
  4.     errno = ENOMEM; 
  5.     err(1, "overflow"); 
  6.  
  7. computed_size = elem_size*num; 

malloc不會給分配的內(nèi)存初始化,如果要對新分配的內(nèi)存初始化,可以用calloc代替malloc,一般情況下給序列分配相等大小的元素時,用calloc來代替用表達式計算大小,calloc 會把內(nèi)存初始化為 0。

 

[[336373]]

realloc 用來對已經(jīng)分配內(nèi)存的對象改變大小,如果新的 size 更大,額外的空間沒 有 被 初 始 化 , 如 果 提 供 給 realloc 的 指 針 是 空 指 針 , realloc 就 等 效 于malloc,如果原指針非空而 new size是0,結(jié)果依賴于操作系統(tǒng)的具體實現(xiàn)。

  • “In case of failure realloc shall return NULL and leave provided memoryobject intact. Thus it is important not only to check for integeroverflow of size argument, but also to correctly handle object size ifrealloc fails.”

下面這段代碼可以帶你領(lǐng)會malloc,calloc,realloc,free的用法:

  1. #include <stdio.h> 
  2. #include <stdint.h> 
  3. #include <malloc.h> 
  4. #include <errno.h> 
  5.  
  6. #define VECTOR_OK            0 
  7. #define VECTOR_NULL_ERROR    1 
  8. #define VECTOR_SIZE_ERROR    2 
  9. #define VECTOR_ALLOC_ERROR   3 
  10.  
  11. struct vector { 
  12.     int *data; 
  13.     size_t size
  14. }; 
  15.  
  16. int create_vector(struct vector *vc, size_t num) { 
  17.  
  18.     if (vc == NULL) { 
  19.         return VECTOR_NULL_ERROR; 
  20.     } 
  21.  
  22.     vc->data = 0; 
  23.     vc->size = 0; 
  24.  
  25.     /* check for integer and SIZE_MAX overflow */ 
  26.     if (num == 0 || SIZE_MAX / num < sizeof(int)) { 
  27.         errno = ENOMEM; 
  28.         return VECTOR_SIZE_ERROR; 
  29.     } 
  30.  
  31.     vc->data = calloc(num, sizeof(int)); 
  32.  
  33.     /* calloc faild */ 
  34.     if (vc->data == NULL) { 
  35.         return VECTOR_ALLOC_ERROR; 
  36.     } 
  37.  
  38.     vc->size = num * sizeof(int); 
  39.     return VECTOR_OK; 
  40.  
  41. int grow_vector(struct vector *vc) { 
  42.  
  43.     void *newptr = 0; 
  44.     size_t newsize; 
  45.  
  46.     if (vc == NULL) { 
  47.         return VECTOR_NULL_ERROR; 
  48.     } 
  49.  
  50.  
  51.     /* check for integer and SIZE_MAX overflow */ 
  52.     if (vc->size == 0 || SIZE_MAX / 2 < vc->size) { 
  53.         errno = ENOMEM; 
  54.         return VECTOR_SIZE_ERROR; 
  55.     } 
  56.  
  57.     newsize = vc->size * 2; 
  58.  
  59.     newptr = realloc(vc->data, newsize); 
  60.  
  61.     /* realloc faild; vector stays intact size was not changed */ 
  62.     if (newptr == NULL) { 
  63.         return VECTOR_ALLOC_ERROR; 
  64.     } 
  65.  
  66.     /* upon success; update new address and size */ 
  67.     vc->data = newptr; 
  68.     vc->size = newsize; 
  69.     return VECTOR_OK; 

 

[[336374]]

避免重大錯誤

使用未初始化的變量,C語言要求所有變量在使用之前要初始化,使用未初始化的變量會造成為定義的行為,這和C++不同,C++保證所有變量在使用之前都得到初始化,Java盡量保證變量使用前的得到初始化,如類基本數(shù)據(jù)成員會被初始化為默認值。

free錯誤對空指針調(diào)用 free,對不是由 malloc family 函數(shù)分配的指針調(diào)用 free,或者對已經(jīng)調(diào)用 free 的指針再次調(diào)用 free。一開始初始化指針為NULL可以減少錯誤,GCC和Clang編譯器有-Wuninitialized 選項來對未初始化的變量顯示警告信息,另外不要將同一個指針用于靜態(tài)變量和動態(tài)變量。

  1. char *ptr = NULL; void nullfree(void **pptr) { void *ptr = *pptr; assert(ptr != NULLfree(ptr); *pptr = NULL; } 

3.對空指針解引用,數(shù)組越界訪問

對NULL指針或者free’d內(nèi)存解引用,數(shù)組越界訪問,是很明顯的錯誤,為了消除這種錯誤,一般的做法就是增加數(shù)組越界檢查的功能,比如Java里的array就有下標檢查的功能,但是這樣會帶來嚴重的性能代價,我們要修改ABI(application binary interface),讓每個指針都跟隨著它的范圍信息,在數(shù)值計算中cost is terrible。

4.違反類型規(guī)則

把int×指針cast成float×,然后對它解引用,在C里面會引發(fā)undefined behavior,C規(guī)定這種類型的轉(zhuǎn)換需要使用memset,C++里面有個reinterpret_cast函數(shù)用于無關(guān)類型之間的轉(zhuǎn)換,reinterpret_cast (expression)

防止內(nèi)存泄漏

內(nèi)存泄漏發(fā)生在程序不再使用的動態(tài)內(nèi)存沒有得到釋放,這需要我們掌握動態(tài)分配對象的作用域,尤其是什么時候該調(diào)用free來釋放內(nèi)存,常用的集中方法如下:

  • 在程序啟動的時候分配在程序啟動的時候分配需要的heap memory,程序退出時把釋放的任務(wù)交給操作系統(tǒng),這種方法一般適用于程序運行后馬上退出的那種。
  • 使用變長數(shù)組(VLA)如果你需要一塊變長大小的空間并且作用域在函數(shù)中,變長數(shù)組可以幫到你,但是也有一個限制,一個函數(shù)中的變長數(shù)組內(nèi)存大小一般不超過幾百字節(jié),這個數(shù)字C標準沒有明確的定義,最好是把內(nèi)存分配到棧上,在棧上允許分配的最大VLA內(nèi)存是SIZE_MAX,掌握目標平臺的棧大小可以有效的防止棧溢出。
  • 使用引用計數(shù)引用計數(shù)是一個很好的管理內(nèi)存的方法,特別是當你不希望自己定義的對象被復(fù)制時,每一次賦值把引用計數(shù)加1,每次失去引用就把引用計數(shù)減1,當引用計數(shù)等于0時,以為的對象已經(jīng)不再需要了,我們需要釋放對象占用的內(nèi)存,由于C不提供自動的析構(gòu)函數(shù),我們必須手動釋放內(nèi)存,看一個例子:
  1. #include <stdlib.h> #include <stdint.h> #define MAX_REF_OBJ 100  
  2. #define RC_ERROR -1 struct mem_obj_t{ void *ptr; uint16_t count; };  
  3. static struct mem_obj_t references[MAX_REF_OBJ]; static uint16_t  
  4. reference_count = 0; /* create memory object and return handle */  
  5. uint16_t create(size_t size){ if (reference_count >= MAX_REF_OBJ)  
  6. return RC_ERROR; if (size){ void *ptr = calloc(1, size); if (ptr !=  
  7. NULL){ references[reference_count].ptr = ptr;  
  8. references[reference_count].count = 0; return reference_count++; } }  
  9. return RC_ERROR; } 
  1. /* get memory object and increment reference counter */ 
  2. void* retain(uint16_t handle){ 
  3.  
  4. if(handle < reference_count && handle >= 0){ 
  5.     references[handle].count++; 
  6.     return references[handle].ptr; 
  7.     } else { 
  8.         return NULL
  9.     } 
  10.  
  11. /* decrement reference counter */ 
  12. void release(uint16_t handle){ 
  13. printf("release\n"); 
  14.  
  15. if(handle < reference_count && handle >= 0){ 
  16.     struct mem_obj_t *object = &references[handle]; 
  17.  
  18.     if (object->count <= 1){ 
  19.         printf("released\n"); 
  20.     free(object->ptr); 
  21.     reference_count--; 
  22. else { 
  23.     printf("decremented\n"); 
  24.     object->count--; 
  25.         } 
  26.      } 

C++標準庫有個auto_ptr智能指針,能夠自動釋放指針所指對象的內(nèi)存,C++ boost庫有個boost::shared_ptr智能指針,內(nèi)置引用計數(shù),支持拷貝和賦值,看下面這個例子:

  • “Objects of shared_ptr types have the ability of taking ownership of a pointer and share that ownership: once they take ownership, the group of owners of a pointer become responsible for its deletion when the last one of them releases that ownership.”
  1. #include <boost/smart_ptr.hpp> 
  2. #include <iostream> 
  3. int main() 
  4.     // Basic useage 
  5.     boost::shared_ptr<int> p1(new int(10)); 
  6.     std::cout << "ref count of p1: " << p1.use_count() << std::endl; 
  7.     boost::shared_ptr<int> p2(p1); // or p2 = p1; 
  8.     std::cout << "ref count of p1: " << p1.use_count() << std::endl; 
  9.     *p1 = 999; 
  10.     std::cout << "*p2: " << *p2 << std::endl; 
  11.     p2.reset(); 
  12.     std::cout << "ref count of p1: " << p1.use_count() << std::endl; 
  13.     return 0; 

4.內(nèi)存池,有利于減少內(nèi)存碎片,看下面這個例子:

  1. #include <stdlib.h> 
  2. #include <stdint.h> 
  3.  
  4. struct mem_pool_t{ 
  5. void* ptr;//指向內(nèi)存池起始地址 
  6. size_t size;//內(nèi)存池大小 
  7. size_t used;//已用內(nèi)存大小 
  8. }; 
  9.  
  10. //create memory pool 
  11. struct mem_pool_t* create_pool(size_t size){ 
  12. mem_pool_t* pool=calloc(1,sizeof(struct men_pool_t)); 
  13. if(pool!=NULL){ 
  14. void* mem=calloc(1,size); 
  15. if(mem!=NULL){ 
  16. pool->ptr=mem; 
  17. pool->size=size
  18. pool->used=0; 
  19. return pool; 
  20.         } 
  21.     } 
  22. return NULL
  23.  
  24. //allocate memory from pool 
  25. void* pool_alloc(mem_pool_t* pool,size_t size){ 
  26. if(pool=NULL
  27.     return NULL
  28. size_t bytes_left=pool->size-pool->used; 
  29. if(size&&size<=bytes_left){ 
  30.     void* mem=pool->ptr+pool->used; 
  31.     pool->used+=size
  32.     return mem; 
  33.     } 
  34. return NULL; 
  35.  
  36. //release memory of the pool 
  37. void pool_free(mem_pool_t* pool){ 
  38. if(pool!=NULL){ 
  39. free(pool->ptr); 
  40. free(pool); 
  41.  } 

5.垃圾回收機制引用計數(shù)采用的方法是當內(nèi)存不再需要時得到手動釋放,垃圾回收發(fā)生在內(nèi)存分配失敗或者內(nèi)存到達一定的水位(watermarks),實現(xiàn)垃圾回收最簡單的一個算法是MARK AND SWEEP算法,該算法的思路是遍歷所有動態(tài)分配對象的內(nèi)存,標記那些還能繼續(xù)使用的,回收那些沒有被標記的內(nèi)存。Java采用的垃圾回收機制就更復(fù)雜了,思路也是回收那些不再使用的內(nèi)存,JAVA的垃圾回收和C++的析構(gòu)函數(shù)又不一樣,C++保證對象在使用之前得到初始化,對象超出作用域之后內(nèi)存得到釋放,而JAVA不能保證對象一定被析構(gòu)。

 

[[336375]]

指針和數(shù)組

我們一般的概念里指針和數(shù)組名是可互換的,但是在編譯器里他們被不同的對待,當我們說一個對象或者表達式具有某種類型的時候我們一般是說這個對象是個左值(lvalue),當對象不是const的時候,左值是可以修改的,比如對象是復(fù)制操作符的左參數(shù),而數(shù)組名是一個const左值,指向地一個元素的const指針,所以你不能給數(shù)組名賦值或者意圖改變數(shù)組名,如果表達式是數(shù)組類型,數(shù)組名通常轉(zhuǎn)換成指向地一個元素的指針。

但是也有例外,什么情況下數(shù)組名不是一個指針呢?1.當它是sizeof操作符的操作數(shù)時,返回數(shù)組占的內(nèi)存字節(jié)數(shù)2.當它是取地址操作&的操作數(shù)時,返回一個數(shù)組的地址

看下面這個例子:

  1. short a[] = {1,2,3}; 
  2. short *pa; 
  3. short (*px)[]; 
  4.  
  5. void init(){ 
  6.     pa = a; 
  7.     px = &a; 
  8.  
  9.     printf("a:%p; pa:%p; px:%p\n", a, pa, px); 
  10.  
  11.     printf("a[1]:%i; pa[1]:%i (*px)[1]:%i\n", a[1], pa[1],(*px)[1]); 

a是一個short類型數(shù)組,pa是一個指向short類型的指針,px呢?px是一個指向數(shù)組類型的指針,在a被賦值給pa之前,他的值被轉(zhuǎn)換成一個指向數(shù)組第一個元素的指針,下面那個a卻沒有轉(zhuǎn)換,因為遇到的是&操作符。數(shù)組下標a[1]等價于(a+1),和p[1]一樣,也指向(p+1),但是兩者還是有區(qū)別的,a是一個數(shù)組,它實際上存儲的是第一個元素的地址,所以數(shù)組a是用來定位第一個元素的,而pa不一樣,它就是一個指針,不是用來定位的。再比如:

  1. int a[10]; 
  2. int b[10]; 
  3. int *a; 
  4. c=&a[0];//c是指向數(shù)組a地一個元素的指針 
  5. c=a;//a自動轉(zhuǎn)換成指向第一個元素的指針,實際上是指針拷貝 
  6. b=a;//非法的,你不能用賦值符把一個數(shù)組的所有元素賦給另一個數(shù)組 
  7. a=c;//非法的,你不能修改const指針的值 

 

責任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2020-03-16 16:20:03

less查看文件Linux

2017-12-15 13:44:22

2020-09-15 08:35:57

TypeScript JavaScript類型

2017-12-25 13:26:36

CNN深度學(xué)習(xí)網(wǎng)絡(luò)

2018-11-25 10:08:44

阿里巴巴技術(shù)開源

2020-02-21 14:55:02

Python代碼字符串

2018-01-26 08:26:35

RAID陣列組成

2021-01-29 13:22:58

Swagger版本OpenAPI

2017-10-10 13:58:38

前端CSS濾鏡技巧

2013-09-09 09:59:39

虛擬化云計算

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2020-02-17 16:47:44

Android Context細節(jié)

2014-07-29 16:21:57

Git

2011-04-13 10:06:50

網(wǎng)關(guān)路由器寬帶路由器

2010-08-23 09:20:11

Linux命令

2015-11-02 13:50:34

物聯(lián)網(wǎng)物聯(lián)網(wǎng)發(fā)展

2015-03-25 11:14:28

2018-02-07 08:21:42

2020-02-13 18:05:18

數(shù)組reduce前端
點贊
收藏

51CTO技術(shù)棧公眾號

中文在线а√天堂| 开心激情五月网| h片在线免费| 国产一区二区三区免费在线观看| 久久夜色精品亚洲噜噜国产mv| 午夜免费高清视频| 日本在线www| 国产乱妇无码大片在线观看| 久久久久久久av| 野外性满足hd| 亚洲免费资源| 亚洲va欧美va天堂v国产综合| 免费在线成人av电影| 国产精品51麻豆cm传媒| 综合激情视频| 日韩成人久久久| 亚洲妇熟xx妇色黄蜜桃| 91丝袜在线| 国产精品第五页| 国产一区二区三区四区五区在线| 精品国产乱子伦| 91成人精品| 亚洲人成五月天| 免费高清视频在线观看| 成人片免费看| 一区二区三区精品| 亚洲精品国产精品久久| 人妻91麻豆一区二区三区| 日本中文一区二区三区| 欧美激情中文网| 肉色超薄丝袜脚交69xx图片| 欧美aaaaa级| 欧美一区二区三区爱爱| 欧美两根一起进3p做受视频| 免费在线观看av电影| 国产精品久久久久影院老司 | 成人avav在线| 成人日韩av在线| 国产三级精品三级在线观看| 牛夜精品久久久久久久99黑人| 亚洲午夜精品视频| 国产艳妇疯狂做爰视频| 亚洲天堂网站| 欧美日韩亚洲国产综合| 日韩欧美亚洲区| 深夜福利在线视频| www.亚洲色图| 懂色中文一区二区三区在线视频| 亚洲综合视频在线播放| 日韩电影在线一区| 欧美自拍大量在线观看| 国产午夜精品无码| 欧美日韩四区| 九九热精品在线| 国产av 一区二区三区| 久久在线视频| 精品国产一区av| 亚洲熟女毛茸茸| 久久精品99久久无色码中文字幕| 亚洲精品在线不卡| 欧美多人猛交狂配| 国产区精品区| 国产亚洲一级高清| 国产精品久久免费观看| 欧美在线电影| 日韩在线不卡视频| 欧美第一页在线观看| 国产精品久久久久久久免费观看| 精品国产一区av| 91久久国产综合| 欧美日韩在线大尺度| 欧美激情一区二区三级高清视频 | 国产mv久久久| 国产精品乱码一区二区视频| 日韩电影一二三区| 国产啪精品视频网站| 97成人在线观看| 国产精品18久久久| 国产一区不卡在线观看| 性感美女福利视频| 国产欧美日韩亚州综合 | 97超级碰碰| 日本激情视频网站| 久久久久久黄色| 亚洲春色在线视频| av毛片在线免费看| 香蕉av福利精品导航| 欧美一级片中文字幕| 久久精品国产福利| 欧美岛国在线观看| 日本高清www| 欧美大人香蕉在线| 国内成人精品一区| 欧美人一级淫片a免费播放| 捆绑调教美女网站视频一区| av蓝导航精品导航| 噜噜噜噜噜在线视频| 国产精品午夜免费| 国产成人一区二区三区别| 日本不卡免费高清视频在线| 欧美亚洲动漫另类| 69久久精品无码一区二区| 欧美日韩一区二区三区在线电影 | 成年人小视频在线观看| 亚洲图区在线| 久久久精品久久久| 日韩精品在线免费视频| 久久精品国产久精国产| 国产欧美日韩伦理| 在线观看免费版| 亚洲h在线观看| 国产精品一区二区羞羞答答| www.豆豆成人网.com| 亚洲无亚洲人成网站77777| 国产午夜手机精彩视频| 国产美女一区| 91亚洲午夜在线| 黄色软件在线| 亚洲制服欧美中文字幕中文字幕| 亚洲不卡视频在线| 日本中文字幕在线一区| 欧美区在线播放| 中文字幕人妻一区二区三区视频| 成人精品视频一区| 亚洲小视频在线播放| 99久久婷婷国产综合精品首页 | 欧美激情视频一区二区三区免费| 国产成人极品视频| 午夜成人鲁丝片午夜精品| 亚洲精品国产无套在线观| 91n.com在线观看| 亚洲人成亚洲精品| 91国在线精品国内播放| 亚洲av永久无码国产精品久久 | 天天综合天天做| 欧美亚洲三区| 国产精品手机在线| 日日夜夜天天综合入口| 欧美丰满美乳xxx高潮www| 亚洲黄色小说视频| 国产亚洲高清视频| 国产综合欧美在线看| 午夜成年人在线免费视频| 欧美亚一区二区| 波多野结衣办公室33分钟| 精品成人一区| 高清不卡日本v二区在线| 国产激情视频在线| 777久久久精品| 视频国产一区二区| 久久精品国产亚洲aⅴ| 亚洲一卡二卡三卡四卡无卡网站在线看 | 粉嫩av一区二区三区| av电影一区二区三区| 在线日韩三级| 久久久国产成人精品| 国产精品久久777777换脸| 国产精品麻豆欧美日韩ww| 亚洲欧美自偷自拍另类| 日本女优一区| 91精品国产综合久久香蕉的用户体验| 午夜视频在线| 91精品国产综合久久福利软件| 91久久国产综合| 国产福利一区二区三区视频| www.国产在线视频| 欧美成人专区| 国产成人精品一区二区三区| yiren22亚洲综合伊人22| 欧美日韩精品久久久| 亚洲女人久久久| 国产福利一区二区| 青青青免费在线| 免费观看不卡av| 国产精品欧美日韩| 2024最新电影在线免费观看| 精品久久久久久久久久久久久久久久久 | 亚洲精品成av人片天堂无码| 亚洲高清免费观看| 熟女俱乐部一区二区| 日韩福利电影在线观看| 成年人三级视频| 国语一区二区三区| 国产精品88a∨| 91网址在线观看| 亚洲国产免费av| 中文在线观看免费高清| 亚洲欧美另类小说视频| 中文字幕一区二区人妻电影丶| 天使萌一区二区三区免费观看| 亚洲一区二区精品在线| 爱高潮www亚洲精品| 国产精品高潮在线| 色爱综合区网| 一本色道久久88综合亚洲精品ⅰ| 99精品久久久久久中文字幕| 图片区小说区国产精品视频| 国产精品理论在线| 豆国产96在线|亚洲| 久久无码高潮喷水| 欧美91大片| 日韩av电影免费播放| 91精品国产乱码久久久竹菊| 国产精品69av| 17videosex性欧美| 日韩在线观看免费av| 天堂av2024| 制服丝袜在线91| 日韩毛片一区二区三区| 樱花草国产18久久久久| 高潮毛片无遮挡| 岛国精品在线播放| 色乱码一区二区三区在线| 夜夜嗨一区二区| 精品一区二区三区毛片| 清纯唯美亚洲综合一区| 你懂的视频在线一区二区| 亚洲经典视频| 成人免费xxxxx在线观看| 成人免费看黄| 久久久久久久久久久亚洲| 日本中文字幕伦在线观看| 日韩av一区二区在线观看| av在线资源观看| 精品视频1区2区| 欧美一区免费看| 午夜精品久久久久久久蜜桃app | 五月天国产精品| 激情小说中文字幕| 日韩毛片视频在线看| 天天操天天干天天操天天干| 久久综合狠狠综合久久综合88 | 欧美激情一区二区三区蜜桃视频| 中文字幕免费高清视频| 国产寡妇亲子伦一区二区| 红桃视频 国产| 麻豆成人免费电影| 香蕉视频网站入口| 青青国产91久久久久久| 国产成人av影视| 亚洲影音先锋| 国产成人在线免费看| 日韩午夜av| 国产综合av在线| 最新亚洲激情| 水蜜桃色314在线观看| 影音先锋中文字幕一区二区| 青青草视频国产| 欧美精品99| 日韩成人三级视频| 狠狠干成人综合网| av网站手机在线观看| 亚洲狠狠婷婷| 久久免费视频3| 久久精品二区三区| 91av在线免费播放| 日韩电影在线一区二区| 日本特黄a级片| 久久国产精品色婷婷| 亚洲视频第二页| 韩国精品免费视频| 日韩av福利在线观看| 国产99久久久精品| 国产chinese中国hdxxxx| 99热99精品| 中文字幕一二三四区| 久久久精品蜜桃| 91禁男男在线观看| 伊人开心综合网| 免费在线观看日韩| 疯狂蹂躏欧美一区二区精品| 91久久国产综合久久91| 欧美午夜在线一二页| 国产精品自拍电影| 欧美v日韩v国产v| 日本天堂在线| 色阁综合伊人av| 香蕉成人app免费看片| 国内精品久久久| 亚洲国产尤物| 亚洲一区二区三区在线视频| 国产精品115| 日韩少妇中文字幕| 午夜久久tv| 丰满人妻中伦妇伦精品app| 美女诱惑一区二区| 国产欧美视频一区| 国产性做久久久久久| 成人免费黄色小视频| 午夜久久电影网| 中文在线免费观看| 亚洲电影免费观看高清| www免费网站在线观看| 欧美大片免费观看| 最新日韩三级| 91精品天堂| 国产一区二区三区探花| 蜜桃视频一区二区在线观看| 爽爽淫人综合网网站| 国产999免费视频| 国产日韩欧美制服另类| 国产a免费视频| 欧美一a一片一级一片| 亚洲精品字幕在线观看| 中文字幕欧美亚洲| 麻豆网站免费在线观看| 91午夜在线播放| 国产一区二区三区四区大秀| 免费网站永久免费观看| 麻豆91精品视频| 人妻丰满熟妇aⅴ无码| 亚洲欧美一区二区三区极速播放| 伦av综合一区| 精品国产乱码久久久久久1区2区 | 久久久久久久成人| 九七电影院97理论片久久tvb| 国产视频精品网| 在线看片不卡| 亚洲天堂2018av| 久久精品一区二区三区不卡牛牛| 精品一区二区三区人妻| 欧美日韩电影一区| 国产最新视频在线观看| 91精品国产高清| 97久久综合精品久久久综合| 欧美亚洲视频一区| 日本免费在线视频不卡一不卡二| 国产精品无码专区| 亚洲国产精品久久人人爱蜜臀| 国产又爽又黄免费软件| 有码中文亚洲精品| 国产在线精彩视频| 国产精品毛片一区视频| 9999国产精品| 国产九九在线视频| 欧美韩日一区二区三区四区| 高清乱码免费看污| 日韩精品在线看| 麻豆理论在线观看| 国产一区二区三区av在线| 亚洲美女毛片| 亚洲视频 中文字幕| 一级特黄大欧美久久久| 99精品在线看| 久青草国产97香蕉在线视频| 久久亚洲人体| 在线视频亚洲自拍| 久久99精品国产.久久久久| 国产免费嫩草影院| 欧美日韩夫妻久久| a天堂中文在线官网在线| 91夜夜揉人人捏人人添红杏| 亚洲h色精品| 国产成人av免费观看| 亚洲欧美日韩久久精品| 国产三区在线播放| 色综合久久久久久中文网| 一区二区三区国产好| 国产黄色片免费在线观看| a在线播放不卡| 久久精品国产成人av| 亚洲欧美日韩成人| 免费高清视频在线一区| 综合久久国产| 国产成人三级在线观看| 国产午夜视频在线播放| 日韩精品视频在线播放| 我爱我色成人网| 亚洲精品永久www嫩草| 国产呦萝稀缺另类资源| 久久免费视频6| 亚洲美女动态图120秒| 成人精品国产亚洲| 91精品一区二区三区四区| www.欧美亚洲| 丁香社区五月天| xvideos亚洲| 国产ts一区| 看欧美ab黄色大片视频免费 | 亚洲精品一区二区网址| 欧美日韩免费电影| 日韩在线观看a| 久久精品视频一区二区三区| 91精品视频免费在线观看| 欧美另类精品xxxx孕妇| 色狠狠久久av综合| 香港日本韩国三级网站| 一区二区激情小说| 黄色片在线免费看| 91综合免费在线| 国产精品最新自拍| 性色av无码久久一区二区三区| 亚洲成人网在线| 不卡亚洲精品| 成人免费视频91| 国产精品久久久久桃色tv| 成人免费视频国产| 国产精品永久在线| 一区二区三区国产在线| 国产老头老太做爰视频|