日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 玩轉(zhuǎn)嵌入式
[導(dǎo)讀]所謂的數(shù)組越界,簡單地講就是指數(shù)組下標(biāo)變量的取值超過了初始定義時(shí)的大小,導(dǎo)致對數(shù)組元素的訪問出現(xiàn)在數(shù)組的范圍之外,這類錯(cuò)誤也是 C 語言程序中最常見的錯(cuò)誤之一。

素材來源:嵌入式ARM
所謂的數(shù)組越界,簡單地講就是指數(shù)組下標(biāo)變量的取值超過了初始定義時(shí)的大小,導(dǎo)致對數(shù)組元素的訪問出現(xiàn)在數(shù)組的范圍之外,這類錯(cuò)誤也是 C 語言程序中最常見的錯(cuò)誤之一。
在 C 語言中,數(shù)組必須是靜態(tài)的。換而言之,數(shù)組的大小必須在程序運(yùn)行前就確定下來。由于 C 語言并不具有類似 Java 等語言中現(xiàn)有的靜態(tài)分析工具的功能,可以對程序中數(shù)組下標(biāo)取值范圍進(jìn)行嚴(yán)格檢查,一旦發(fā)現(xiàn)數(shù)組上溢或下溢,都會因拋出異常而終止程序。也就是說,C 語言并不檢驗(yàn)數(shù)組邊界,數(shù)組的兩端都有可能越界,從而使其他變量的數(shù)據(jù)甚至程序代碼被破壞。
因此,數(shù)組下標(biāo)的取值范圍只能預(yù)先推斷一個(gè)值來確定數(shù)組的維數(shù),而檢驗(yàn)數(shù)組的邊界是程序員的職責(zé)。
一般情況下,數(shù)組的越界錯(cuò)誤主要包括兩種: 數(shù)組下標(biāo)取值越界與指向數(shù)組的指針的指向范圍越界。

數(shù)組下標(biāo)取值越界

數(shù)組下標(biāo)取值越界主要是指訪問數(shù)組的時(shí)候,下標(biāo)的取值不在已定義好的數(shù)組的取值范圍內(nèi),而訪問的是無法獲取的內(nèi)存地址。例如,對于數(shù)組 int a[3],它的下標(biāo)取值范圍是 [0,2](即 a[0]、a[1] 與 a[2])。如果我們的取值不在這個(gè)范圍內(nèi)(如 a[3]),就會發(fā)生越界錯(cuò)誤。示例代碼如下所示:
    1int a[3];  2int i=0;  3for(i=0;i<4;i++)  4{  5 a[i] = i;  6}  7for(i=0;i<4;i++)  8{  9 printf("a[%d]=%d\n",i,a[i]); 10}  
很顯然,在上面的示例程序中,訪問 a[3] 是非法的,將會發(fā)生越界錯(cuò)誤。因此,我們應(yīng)該將上面的代碼修改成如下形式:
    1int a[3];  2int i=0;  3for(i=0;i<3;i++)  4{  5 a[i] = i;  6}  7for(i=0;i<3;i++)  8{  9 printf("a[%d]=%d\n",i,a[i]); 10}  

指向數(shù)組的指針的指向范圍越界

指向數(shù)組的指針的指向范圍越界是指定義數(shù)組時(shí)會返回一個(gè)指向第一個(gè)變量的頭指針,對這個(gè)指針進(jìn)行加減運(yùn)算可以向前或向后移動(dòng)這個(gè)指針,進(jìn)而訪問數(shù)組中所有的變量。但在移動(dòng)指針時(shí),如果不注意移動(dòng)的次數(shù)和位置,會使指針指向數(shù)組以外的位置,導(dǎo)致數(shù)組發(fā)生越界錯(cuò)誤。下面的示例代碼就是移動(dòng)指針時(shí)沒有考慮到移動(dòng)的次數(shù)和數(shù)組的范圍,從而使程序訪問了數(shù)組以外的存儲單元。
    1int i;  2int *p;  3int a[5];  4/*數(shù)組a的頭指針賦值給指針p*/  5p=a;  6for(i=0;i<10;i++)  7{  8 /*指針p指向的變量*/  9 *p=i+10; 10 /*指針p下一個(gè)變量*/ 11 p++; 12}  
在上面的示例代碼中,for 循環(huán)會使指針 p 向后移動(dòng) 10 次,并且每次向指針指向的單元賦值。但是,這里數(shù)組 a 的下標(biāo)取值范圍是 [0,4](即 a[0]、a[1]、a[2]、a[3] 與 a[4])。因此,后 5 次的操作會對未知的內(nèi)存區(qū)域賦值,而這種向內(nèi)存未知區(qū)域賦值的操作會使系統(tǒng)發(fā)生錯(cuò)誤。正確的操作應(yīng)該是指針移動(dòng)的次數(shù)與數(shù)組中的變量個(gè)數(shù)相同,如下面的代碼所示:
    1int i;  2int *p;  3int a[5];  4/*數(shù)組a的頭指針賦值給指針p*/  5p=a;  6for(i=0;i<5;i++)  7{  8 /*指針p指向的變量*/  9 *p=i+10; 10 /*指針p下一個(gè)變量*/ 11 p++; 12}  
為了加深大家對數(shù)組越界的了解,下面通過一段完整的數(shù)組越界示例來演示編程中數(shù)組越界將會導(dǎo)致哪些問題。
    1#define PASSWORD "123456"  2int Test(char *str)  3{  4 int flag;  5 char buffer[7];  6 flag=strcmp(str,PASSWORD);  7 strcpy(buffer,str);  8 return flag;  9} 10int main(void) 11{ 12 int flag=0; 13 char str[1024]; 14 while(1) 15 { 16 printf("請輸入密碼:  "); 17 scanf"%s",str); 18 flag = Test(str); 19 if(flag) 20 { 21 printf("密碼錯(cuò)誤!\n"); 22 } 23 else 24 { 25 printf("密碼正確!\n"); 26 } 27 } 28 return 0; 29}  
上面的示例代碼模擬了一個(gè)密碼驗(yàn)證的例子,它將用戶輸入的密碼與宏定義中的密碼 123456進(jìn)行比較。很顯然,本示例中最大的設(shè)計(jì)漏洞就在于 Test() 函數(shù)中的 strcpy(buffer,str) 調(diào)用。
由于程序?qū)⒂脩糨斎氲淖址獠粍?dòng)地復(fù)制到 Test() 函數(shù)的數(shù)組 char buffer[7] 中。因此,當(dāng)用戶的輸入大于 7 個(gè)字符的緩沖區(qū)尺寸時(shí),就會發(fā)生數(shù)組越界錯(cuò)誤,這也就是大家所謂的緩沖區(qū)溢出Buffer overflow 漏洞。
但是要注意,如果這個(gè)時(shí)候我們根據(jù)緩沖區(qū)溢出發(fā)生的具體情況填充緩沖區(qū),不但可以避免程序崩潰,還會影響到程序的執(zhí)行流程,甚至?xí)尦绦蛉?zhí)行緩沖區(qū)里的代碼。示例運(yùn)行結(jié)果為:
    1請輸入密碼:12345  2密碼錯(cuò)誤!  3請輸入密碼:123456  4密碼正確!  5請輸入密碼:1234567  6密碼正確!  7請輸入密碼:aaaaaaa  8密碼正確!  9請輸入密碼:0123456 10密碼錯(cuò)誤! 11請輸入密碼:  
在示例代碼中,flag 變量實(shí)際上是一個(gè)標(biāo)志變量,其值將決定著程序是進(jìn)入 密碼錯(cuò)誤的流程(非 0)還是“密碼正確”的流程(0)。當(dāng)我們輸入錯(cuò)誤的字符串 1234567或者 aaaaaaa,程序也都會輸出“密碼正確”。但在輸入 0123456的時(shí)候,程序卻輸出“密碼錯(cuò)誤”,這究竟是為什么呢?
其實(shí),原因很簡單。當(dāng)調(diào)用 Test() 函數(shù)時(shí),系統(tǒng)將會給它分配一片連續(xù)的內(nèi)存空間,而變量 char buffer[7] int flag 將會緊挨著進(jìn)行存儲,用戶輸入的字符串將會被復(fù)制進(jìn) buffer[7] 中。如果這個(gè)時(shí)候,我們輸入的字符串?dāng)?shù)量超過 6 個(gè)(注意,有字符串截?cái)喾菜阋粋€(gè)),那么超出的部分將破壞掉與它緊鄰著的 flag 變量的內(nèi)容。
當(dāng)輸入的密碼不是宏定義的 123456時(shí),字符串比較將返回 1 或 -1。我們都知道,內(nèi)存中的數(shù)據(jù)按照 4 字節(jié)(DWORD)逆序存儲,所以當(dāng) flag 為 1 時(shí),在內(nèi)存中存儲的是 0x01000000。如果我們輸入包含 7 個(gè)字符的錯(cuò)誤密碼,如 aaaaaaa,那么字符串截?cái)喾?0x00 將寫入 flag 變量,這樣溢出數(shù)組的一個(gè)字節(jié) 0x00 將恰好把逆序存放的 flag 變量改為 0x00000000。在函數(shù)返回后,一旦 main 函數(shù)的 flag 為 0,就會輸出“密碼正確”。這樣,我們就用錯(cuò)誤的密碼得到了正確密碼的運(yùn)行效果。
而對于 0123456,因?yàn)樵谶M(jìn)行字符串的大小比較時(shí),它小于 123456,flag的值是 -1,在內(nèi)存中將按照補(bǔ)碼存放負(fù)數(shù),所以實(shí)際存儲的不是 0x01000000 而是 0xffffffff。那么字符串截?cái)嗪蠓?0x00 淹沒后,變成 0x00ffffff,還是非 0,所以沒有進(jìn)入正確分支。
其實(shí),本示例只是用一個(gè)字節(jié)淹沒了鄰接變量,導(dǎo)致程序進(jìn)入密碼正確的處理流程,使設(shè)計(jì)的驗(yàn)證功能失效。

盡量顯式地指定數(shù)組的邊界

在 C 語言中,為了提高運(yùn)行效率,給程序員更大的空間,為指針操作帶來更多的方便,C 語言內(nèi)部本身不檢查數(shù)組下標(biāo)表達(dá)式的取值是否在合法范圍內(nèi),也不檢查指向數(shù)組元素的指針是不是移出了數(shù)組的合法區(qū)域。因此,在編程中使用數(shù)組時(shí)就必須格外謹(jǐn)慎,在對數(shù)組進(jìn)行讀寫操作時(shí)都應(yīng)當(dāng)進(jìn)行相應(yīng)的檢查,以免對數(shù)組的操作超過數(shù)組的邊界,從而發(fā)生緩沖區(qū)溢出漏洞。
要避免程序因數(shù)組越界所發(fā)生的錯(cuò)誤,首先就需要從數(shù)組的邊界定義開始。盡量顯式地指定數(shù)組的邊界,即使它已經(jīng)由初始化值列表隱式指定。示例代碼如下所示:
   1int a[]={1,2,3,4,5,6,7,8,9,10};  
很顯然,對于上面的數(shù)組 a[],雖然編譯器可以根據(jù)始化值列表來計(jì)算出數(shù)組的長度。但是,如果我們顯式地指定該數(shù)組的長度,例如:
   1int a[10]={1,2,3,4,5,6,7,8,9,10};  
它不僅使程序具有更好的可讀性,并且大多數(shù)編譯器在數(shù)組長度小于初始化值列表的長度時(shí)還會發(fā)生相應(yīng)警告。
當(dāng)然,也可以使用宏的形式來顯式指定數(shù)組的邊界(實(shí)際上,這也是最常用的指定方法),如下面的代碼所示:
   1#define MAX 10 23int a[MAX]={1,2,3,4,5,6,7,8,9,10};  
除此之外,在 C99 標(biāo)準(zhǔn)中,還允許我們使用單個(gè)指示符為數(shù)組的兩段“分配”空間,如下面的代碼所示:
   1int a[MAX]={1,2,3,4,5,[MAX-5]=6,7,8,9,10};  
在上面的 a[MAX]數(shù)組中,如果 MAX 大于 10,數(shù)組中間將用 0 值元素進(jìn)行填充(填充的個(gè)數(shù)為 MAX-10,并從 a[5] 開始進(jìn)行 0 值填充);如果 MAX 小于 10, [MAX-5]之前的 5 個(gè)元素 (1,2,3,4,5)中將有幾個(gè)被 [MAX-5]之后的 5 個(gè)元素 (6,7,8,9,10)所覆蓋,示例代碼如下所示:
    1#define MAX 10  2#define MAX1 15  3#define MAX2 6  4int main(void)  5{  6 int a[MAX]={1,2,3,4,5,[MAX-5]=6,7,8,9,10};  7 int b[MAX1]={1,2,3,4,5,[MAX1-5]=6,7,8,9,10};  8 int c[MAX2]={1,2,3,4,5,[MAX2-5]=6,7,8,9,10};  9 int i=0; 10 int j=0; 11 int z=0; 12 printf("a[MAX]:\n"); 13 for(i=0;i14 { 15 printf("a[%d]=%d ",i,a[i]); 16 } 17 printf("\nb[MAX1]:\n"); 18 for(j=0;j19 { 20 printf("b[%d]=%d ",j,b[j]); 21 } 22 printf("\nc[MAX2]:\n"); 23 for(z=0;z24 { 25 printf("c[%d]=%d ",z,c[z]); 26 } 27 printf("\n"); 28 return 0; 29}  
運(yùn)行結(jié)果為:
   1a[MAX]: 2a[0]=1 a[1]=2 a[2]=3 a[3]=4 a[4]=5 a[5]=6 a[6]=7 a[7]=8 a[8]=9 a[9]=10 3b[MAX1]: 4b[0]=1 b[1]=2 b[2]=3 b[3]=4 b[4]=5 b[5]=0 b[6]=0 b[7]=0 b[8]=0 b[9]=0 b[10]=6 b[11]=7 b[12]=8 b[13]=9 b[14]=10 5c[MAX2]: 6c[0]=1 c[1]=6 c[2]=7 c[3]=8 c[4]=9 c[5]=10  

對數(shù)組做越界檢查,確保索引值位于合法的范圍之內(nèi)

要避免數(shù)組越界,除了上面所闡述的顯式指定數(shù)組的邊界之外,還可以在數(shù)組使用之前進(jìn)行越界檢查,檢查數(shù)組的界限和字符串(也以數(shù)組的方式存放)的結(jié)束,以保證數(shù)組索引值位于合法的范圍之內(nèi)。例如,在寫處理數(shù)組的函數(shù)時(shí),一般應(yīng)該有一個(gè)范圍參數(shù);在處理字符串時(shí)總檢查是否遇到空字符‘\0’。
來看下面一段代碼示例:
    1#define ARRAY_NUM 10  2int *TestArray(int num,int value)  3{  4 int *arr=NULL;  5 arr=(int *)malloc(sizeof(int)*ARRAY_NUM);  6 if(arr!=NULL)  7 {  8 arr[num]=value;  9 } 10 else 11 { 12 /*處理arr==NULL*/ 13 } 14 return arr; 15}  
從上面的 int*TestArray(int num,int value)函數(shù)中不難看出,其中存在著一個(gè)很明顯的問題,那就是無法保證 num 參數(shù)是否越界(即當(dāng) num>=ARRAY_NUM的情況)。因此,應(yīng)該對 num 參數(shù)進(jìn)行越界檢查,示例代碼如下所示:
    1int *TestArray(int num,int value)  2{  3 int *arr=NULL;  4 /*越界檢查(越上界)*/  5 if(num 6 {  7 arr=(int *)malloc(sizeof(int)*ARRAY_NUM);  8 if(arr!=NULL)  9 { 10 arr[num]=value; 11 } 12 else 13 { 14 /*處理arr==NULL*/ 15 } 16 } 17 return arr; 18}  
這樣通過 if(num語句進(jìn)行越界檢查,從而保證 num 參數(shù)沒有越過這個(gè)數(shù)組的上界?,F(xiàn)在看起來,TestArray() 函數(shù)應(yīng)該沒什么問題,也不會發(fā)生什么越界錯(cuò)誤。
但是,如果仔細(xì)檢查,TestArray() 函數(shù)仍然還存在一個(gè)致命的問題,那就是沒有檢查數(shù)組的下界。由于這里的 num 參數(shù)類型是 int 類型,因此可能為負(fù)數(shù)。如果 num 參數(shù)所傳遞的值為負(fù)數(shù),將導(dǎo)致在 arr 所引用的內(nèi)存邊界之外進(jìn)行寫入。
當(dāng)然,你可以通過向 if(num語句里面再加一個(gè)條件進(jìn)行測試,如下面的代碼所示:
   1if(num>=0&&num2{ 3}  
但是,這樣的函數(shù)形式對調(diào)用者來說是不友好的(由于 int 類型的原因,對調(diào)用者來說仍然可以傳遞負(fù)數(shù),至于在函數(shù)中怎么處理那是另外一件事情),因此,最佳的解決方案是將 num 參數(shù)聲明為 size_t 類型,從根本上防止它傳遞負(fù)數(shù),示例代碼如下所示:
    1int *TestArray(size_t num,int value)  2{  3 int *arr=NULL;  4 /*越界檢查(越上界)*/  5 if(num 6 {  7 arr=(int *)malloc(sizeof(int)*ARRAY_NUM);  8 if(arr!=NULL)  9 { 10 arr[num]=value; 11 } 12 else 13 { 14 /*處理arr==NULL*/ 15 } 16 } 17 return arr; 18}  

獲取數(shù)組的長度時(shí)不要對指針應(yīng)用 sizeof 操作符

在 C 語言中,sizeof 這個(gè)其貌不揚(yáng)的家伙經(jīng)常會讓無數(shù)程序員叫苦連連。同時(shí),它也是各大公司爭相選用的面試必備題目。簡單地講,sizeof 是一個(gè)單目操作符,不是函數(shù)。其作用就是返回一個(gè)操作數(shù)所占的內(nèi)存字節(jié)數(shù)。其中,操作數(shù)可以是一個(gè)表達(dá)式或括在括號內(nèi)的類型名,操作數(shù)的存儲大小由操作數(shù)的類型來決定。例如,對于數(shù)組 int a[5],可以使用 sizeof(a)來獲取數(shù)組的長度,使用 sizeof(a[0])來獲取數(shù)組元素的長度。
但需要注意的是,sizeof 操作符不能用于函數(shù)類型、不完全類型(指具有未知存儲大小的數(shù)據(jù)類型,如未知存儲大小的數(shù)組類型、未知內(nèi)容的結(jié)構(gòu)或聯(lián)合類型、void 類型等)與位字段。例如,以下都是不正確形式:
    1/*若此時(shí)max定義為intmax();*/  2sizeof(max)  3/*若此時(shí)arr定義為char arr[MAX],且MAX未知*/  4sizeof(arr)  5/*不能夠用于void類型*/  6sizeof(void)  7/*不能夠用于位字段*/  8struct S  9{ 10 unsigned int f1 : 1; 11 unsigned int f2 : 5; 12 unsigned int f3 : 12; 13}; 14sizeof(S.f1);  
了解 sizeof 操作符之后,現(xiàn)在來看下面的示例代碼:
    1void Init(int arr[])  2{  3 size_t i=0;  4 for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)  5 {  6 arr[i]=i;  7 }  8}  9int main(void) 10{ 11 int i=0; 12 int a[10]; 13 Init(a); 14 for(i=0;i<10;i++) 15 { 16 printf("%d\n",a[i]); 17 } 18 return 0; 19}  
從表面看,上面代碼的輸出結(jié)果應(yīng)該是 0,1,2,3,4,5,6,7,8,9,但實(shí)際結(jié)果卻出乎我們的意料,如圖 1 所示。
圖 1 示例代碼在 VC++2010 中的運(yùn)行結(jié)果
是什么原因?qū)е逻@個(gè)結(jié)果呢?
很顯然,上面的示例代碼在 void Init(int arr[])函數(shù)中接收了一個(gè) int arr[]類型的形參,并且在main函數(shù)中向它傳遞一個(gè) a[10]實(shí)參。同時(shí),在 Init() 函數(shù)中通過 sizeof(arr)/sizeof(arr[0])來確定這個(gè)數(shù)組元素的數(shù)量和初始化值。
在這里出現(xiàn)了一個(gè)很大問題:由于 arr 參數(shù)是一個(gè)形參,它是一個(gè)指針類型,其結(jié)果是 sizeof(arr)=sizeof(int*)。在 IA-32 中, sizeof(arr)/sizeof(arr[0])的結(jié)果為 1。因此,最后的結(jié)果如圖 1 所示。
對于上面的示例代碼,我們可以通過傳入數(shù)組的長度的方式來解決這個(gè)問題,示例代碼如下:
    1void Init(int arr[],size_t arr_len)  2{  3 size_t i=0;  4 for(i=0;i 5 {  6 arr[i]=i;  7 }  8}  9int main(void) 10{ 11 int i=0; 12 int a[10]; 13 Init(a,10); 14 for(i=0;i<10;i++) 15 { 16 printf("%d\n",a[i]); 17 } 18 return 0; 19}  
除此之外,我們還可以通過指針的方式來解決上面的問題,示例代碼如下所示:
    1void Init(int (*arr)[10])  2{  3 size_t i=0;  4 for(i=0;i< sizeof(*arr)/sizeof(int);i++)  5 {  6 (*arr)[i]=i;  7 }  8}  9int main(void) 10{ 11 int i=0; 12 int a[10]; 13 Init(&a); 14 for(i=0;i<10;i++) 15 { 16 printf("%d\n",a[i]); 17 } 18 return 0; 19}  
現(xiàn)在,Init() 函數(shù)中的 arr 參數(shù)是一個(gè)指向 arr[10]類型的指針。需要特別注意的是,這里絕對不能夠使用 void Init(int(*arr)[])來聲明函數(shù),而是必須指明要傳入的數(shù)組的大小,否則 sizeof(*arr)無法計(jì)算。但是在這種情況下,再通過 sizeof 來計(jì)算數(shù)組大小已經(jīng)沒有意義了,因?yàn)榇藭r(shí)數(shù)組大小已經(jīng)指定為 10 了。

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉