首頁 > 軟體

C語言sizeof與字串處理與動態記憶體分配及main函數引數詳解

2022-07-11 10:00:29

常用的字串處理常式(標準庫裡面的)

strlen : 用來求一個字串的長度

                      #include <string.h>
                     size_t strlen(const char *s);
                @s : 指向要計算的那個字串的首地址 
                    “const char *” : 表示在函數呼叫過程中,防止對s指向的空間裡面內容進行修改。
                    “size_t”: size_t => unsigned int  
                              typede unsigned int size_t  ; 

返回值: 返回字串s第一個前面的字元的個數。

atoi:將十進位制的數位字串,轉成整數值

                 #include <stdlib.h>
               int atoi(const char *nptr);
               long atol(const char *nptr);
               long long atoll(const char *nptr); 

strcpy/strncpy :字串拷貝函數 將一個字串拷貝到另外一個字串上面去。

                 #include <string.h>
                strcpy :用來把src指向的字串,拷貝到dest指向的空間中去,直到遇到才會結束。
               char *strcpy(char *dest, const char *src);
                @dest :  destination 目的地 ,必須是一個可寫的空間
                @src : source 源,從哪裡  
                返回值: 返回拷貝後目的地字串的首地址 

strncpy : 正是為了解決strcpy的這個bug的(strcpy沒有考慮到dest指向的空間的大小問題)

                    #include <string.h>
                     char *strncpy(char *dest, const char *src, size_t n);
                    strncpy: 把src指向的字串前面頂多n個字元拷貝到dest指向的記憶體空間中去。
                        它到底拷貝了多少個字元呢? 
                            <= n 

                        (1) 遇到拷貝結束,此時也會被拷貝。
                            char s[10]; 
                            strncpy(s, "12345", 10);    
                        (2) 已經拷貝了n個字元,此時後面的字元就不會被拷貝。 
                            char s[10]; 
                            strncpy(s, "0123456789", 10); 

strcmp / strncmp :一個一個字元進行比較它們對應的ASCII碼

                if c1 > c2 
                    返回1 
                if c1 < c2 
                    返回-1 
                if c1 == c2 
                    則繼續比較下一個字元,如果全部相等則返回0 

				   #include <string.h>
				   int strcmp(const char *s1, const char *s2);
				   int strncmp(const char *s1, const char *s2, size_t n);

strcat / strncat 字串連線函數

             #include <string.h>
            strcat : 用來把src指向的字串拷貝到dest指向的字串的末尾(尾部連線)
             char *strcat(char *dest, const char *src);
            @dest : 指向目標字串(一段可寫的空間) 
                @src : 指向原始字串 
                返回值:  
                    返回連線後的字串的首地址(dest指向的首字元地址)

         char *strncat(char *dest, const char *src, size_t n);
            strncat : 把src指向的字串拷貝到dest末尾,但是它頂多拷貝了n個字元。
                (1) 遇到拷貝結束,此時也會被拷貝。 
                (2) 即使沒有遇到,但是已經拷貝了n個字元啦。 

sizeof 求位元組運運算元

sizeof(x) : 用來求一個物件或型別所佔位元組數的運運算元,x可以是一個物件(變數、指標、陣列、==),也可以是一個型別。

先求x的型別,然後再求該型別所佔的位元組數

=> typeof(x)

=> sizeof( typeof(x) )

sizeof(指標型別) == 機器字長

32bits的機器 指標所佔位元組數為4

64bits的機器 指標所佔位元組數為8

求陣列的大小

		int a[100];
		sieof(a[0]) == 4 
		sizeof(a[1024]) ==  4  
		sizeof(a) == 
			typeof(a) => int[100]
			sizeof(int[100]) => 4 * 100 
		char *  p[4]; //指標陣列
		sizeof(p[0]) ==  8 
		sizeof(p) == 
			typeof(p) => char* [4] 
			sizeof(char *) * 4 == 8 * 4 
		char (*p)[4];//陣列指標
		sizeof(p)  ==  8 
	int (*p)(int ,int); //函數指標
		sizeof(p) ==  8 

動態記憶體分配函數

malloc : 用來動態分配一個size大小的記憶體空間,並且把分配到記憶體空間的首地址返回。

malloc分配的空間的生存期,是隨程序持續性。

malloc分配的空間一旦分配給你,他就不會自動去釋放,一定需要你呼叫free或你的這個進行消亡了!

        #include <stdlib.h>
        void *malloc(size_t size);
                @size : 要分配的空間的大小(以位元組為單位)
                返回值:  
                    成功返回分配的空間的首地址
                    失敗返回NULL. 
        char * p = (char *)malloc(100); 

free : 用來釋放ptr指向的記憶體空間的

ptr指向的記憶體空間,必須是malloc/realloc/calloc這三個函數分配的記憶體空間。

                void free(void *ptr);
                @ptr : 指向咱們需要釋放的那一塊記憶體的首地址
                    一般為malloc/realloc/calloc這三個函數的
                    返回值。 

calloc : 它的作用類似於 malloc ,不過它是陣列分配函數, 它分配一個陣列空間,它帶有兩個引數。

             void *calloc(size_t nmemb, size_t size);
                @nmemb :  表示分配多少元素 
                @size :  表示每一個元素佔多少位元組
                返回值: 
                    成功返回分配的空間的首地址。
                    失敗返回NULL。

int * a = calloc(10, sizeof(int)); 

realloc : 用來把ptr(必須是malloc/realloc/calloc這三個函數分配的記憶體空間)指向的動態記憶體,擴充套件到size大小。

                void *realloc(void *ptr, size_t size);
                @ptr : 指向咱們需要擴充套件的那一塊記憶體的首地址。
                    一般為malloc/realloc/calloc這三個函數的返回值。
                @size : 擴充套件到size大小
                返回值: 
                    成功返回分配的空間的首地址
                    失敗返回NULL。

                1. size > 原來的大小 
                    realloc用來把ptr指向的記憶體,擴充套件到size位元組,
                    原來前面的記憶體保持不變,後面新增記憶體內容不會
                    被初始化。
                    (1) 原址擴建
                    (2) 整體搬遷 
                    2. size ==  0 
                     realloc(ptr, 0) <=> free(ptr)

main的引數問題

在linux下面,程式執行的時候,可以帶引數,只不過所有的引數都當作是字串來處理的。

			//argc :儲存你給main傳參的個數
			//argv : 用來儲存傳遞給main的所有引數的
			//int main(int argc, char * argv[])
			int main(int argc, char ** argv)
			{
			}

到此這篇關於C語言sizeof與字串處理與動態記憶體分配及main函數引數詳解的文章就介紹到這了,更多相關C語言sizeof內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com