<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          C語言如何實現(xiàn)動態(tài)數(shù)組?

          共 3630字,需瀏覽 8分鐘

           ·

          2021-05-05 08:20

          關(guān)注、星標(biāo)公眾號,直達(dá)精彩內(nèi)容

          來源:技術(shù)讓夢想更偉大

          作者:李肖遙

          提出問題

          請問在c語言里如何實現(xiàn)動態(tài)大小的數(shù)組啊,比如說int a[N];,這里N的值可以在程序中定,或者有什么方法可以實現(xiàn)類似的功能?總之只要在編譯時不用制定數(shù)組大小就行。

          分析問題

          嵌入式系統(tǒng)的內(nèi)存是寶貴的,內(nèi)存是否高效率的使用,往往意味著嵌入式設(shè)備的高質(zhì)量和高性能,有時我們所需的內(nèi)存空間無法預(yù)先確定,這里使用靜態(tài)數(shù)組的辦法很難解決,所以高效的使用內(nèi)存對我們來說是很重要的。

          所以我們在自己編寫C語言代碼的時候,就應(yīng)該學(xué)會使用動態(tài)數(shù)組,那么怎么實現(xiàn)呢?

          靜態(tài)數(shù)組與動態(tài)數(shù)組的區(qū)別

          對于靜態(tài)數(shù)組,一旦定義了,數(shù)組長度也就指定好了,系統(tǒng)將為它分配一個固定大小的空間,使用完無需釋放,引用簡單,但是創(chuàng)建后無法改變其大小,這在應(yīng)用中是一個致命弱點!

          對于動態(tài)數(shù)組,它可以隨程序需要而重新指定大小,其創(chuàng)建麻煩,使用完必須由程序員自己釋放,否則將會引起內(nèi)存泄露。但其使用非常靈活,能根據(jù)程序需要動態(tài)分配大小。所以相對于靜態(tài)數(shù)組的來說我們對于使用動態(tài)數(shù)組有很大的自由度。

          動態(tài)數(shù)組的內(nèi)存空間是從堆上分配的,通過執(zhí)行代碼而為其分配存儲空間。當(dāng)程序執(zhí)行到這些語句時,才為其分配,程序員自己負(fù)責(zé)釋放內(nèi)存。

          在創(chuàng)建動態(tài)數(shù)組的過程中要遵循以下原則:

          • 在創(chuàng)建的時候從外層往里層,逐層創(chuàng)建;

          • 在釋放的時候從里層往外層,逐層釋放。

          如何創(chuàng)建動態(tài)數(shù)組?

          下面是一個創(chuàng)建動態(tài)數(shù)組的例子,按照需求設(shè)置數(shù)組大小:

          #include <stdio.h>
          #include <stdlib.h>
          int main(){
              int arrLen; 
              int *array;
              int i;
              printf("please enter length:");
              scanf_s("%d", &arrLen);
              
              array = (int*)malloc( arrLen*sizeof(int) );
              if(!array){
                  printf("create error!\n");
                  exit(1); 
              }
              for(i=0; i<arrLen; i++){
                  array[i] = i+1;
              }
              
              for(i=0; i<arrLen; i++){
                  printf("%d  ", array[i]);
              }
              
              printf("\n");
              free(array); 
              
              system("pause");
              return 0;
          }

          運行結(jié)果:

          使用內(nèi)存中的數(shù)據(jù)

          上面的代碼中,我們通過下標(biāo)array[i]來引用數(shù)組元素,這個靜態(tài)數(shù)組沒有什么區(qū)別。另外還可以通過指針來引用數(shù)組元素,對上面的程序稍作修改:

          #include <stdio.h>
          #include <stdlib.h>
          int main(){
              int arrLen;
              int *array;
              int *arrayCopy;//用來指向具體的數(shù)組元素
              int i;  
              printf("please enter length:");
              scanf_s("%d", &arrLen);
              
              arrayCopy = array = (int*)malloc( arrLen*sizeof(int) );
              if(!array){
                  printf("create error!\n");
                  exit(1); 
              }

              for(i=0; i<arrLen; i++){
                  *arrayCopy++ = i+1;
              }
              
              arrayCopy = array;//重置到數(shù)組首地址
              for(i=0; i<arrLen; i++){
                  printf("%d  ", *arrayCopy++);
              }
              
              printf("\n");
              free(array); 
              
              system("pause");
              return 0;
          }

          需要注意的是,free() 函數(shù)必須釋放整塊內(nèi)存,多定義一個變量 arrayCopy,不斷改變它的值,以指向不同的數(shù)組元素。這樣可以保證 array 變量的值不變,始終指向內(nèi)存首地址,用于free()整塊內(nèi)存。

          當(dāng)然也可以動態(tài)創(chuàng)建多維數(shù)組,其原理都是一樣的,并且需要遵循創(chuàng)建與釋放的原則。

          ????????????????  END  ????????????????

          推薦閱讀:


          嵌入式編程專輯
          Linux 學(xué)習(xí)專輯
          C/C++編程專輯
          Qt進階學(xué)習(xí)專輯

          關(guān)注我的微信公眾號,回復(fù)“加群”按規(guī)則加入技術(shù)交流群。


          這是我另一個技術(shù)號,程序員的編程學(xué)習(xí)基地,注重編程思想,歡迎關(guān)注!


          點擊“閱讀原文”查看更多分享。

          瀏覽 65
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  a62v无码在线 | 国产成人三级在线观看视频 | 大香蕉黄色网 | 97精品人人妻人人A片 | www.久青草精品 |