主頁 >  其他 > 有關C語言記憶體管理的一些總結

有關C語言記憶體管理的一些總結

2021-05-07 08:00:20 其他

C語言記憶體管理總結


文章目錄

目錄

C語言記憶體管理總結

文章目錄

前言

一、記憶體管理簡介以及常見的記憶體使用錯誤

二、記憶體分類

1.堆疊區(stack)

2.全域區

3.常量區

4.堆區(heap)

三、malloc(),calloc(),realloc()函式

1.malloc:

2.calloc:

3.realloc:

四、strcpy(),memcpy(),memmove()函式

1.strcpy:

2.memcpy:

3.memmove:

4.memset:

五、堆疊區(stack)

六、堆區(heap)

申請方式:

申請后系統的回應:

申請大小的限制:

申請效率的比較:

堆和堆疊中的存盤內容:

七、全域區(靜態區)

八、常量區

九、常見錯誤之記憶體越界與記憶體泄露(Memory Leak)

1.記憶體越界

十、記憶體碎片解決

總結



前言

  • 最近也是比較忙,而在學習嵌入式系統的程序中,問題不斷出現,其中一個很重要的問題,也就是記憶體管理知識點的不牢固導致的記憶體分配的各類錯誤,學得我心血來潮,于是就打算寫一篇文章來記錄學習的時候遇到的問題以及記憶體管理的知識點,
  • 本文參照了大量的文章與視頻,鏈接將會于“總結”部分發布,
  • 因為自我感覺也不怎么良好,所以該文也是比較偏向于小白,適合于萌新食用,當然,如果有哪里不足也希望大佬能夠指點指出

一、記憶體管理簡介以及常見的記憶體使用錯誤

雖然我們現在的計算機系統的記憶體已經在“宏大”的方向發展,但學會記憶體管理,并不為一件壞事,相反,這種“優良傳統”在各類場景下會給我們帶來益處,在計算機系統中,特別是嵌入式系統中,記憶體資源是十分有限的,尤其是對于移動端的開發者來說,硬體資源的限制使得其在程式的設計中首先要考慮的問題就是,如何去合理的分配那“一丟丟”的記憶體資源,

日常中我們可能遇到的錯誤:

  1. 記憶體申請沒成功,就去使用了.
  2. 記憶體申請成功,但沒有初始化.
  3. 記憶體初始化成功,但越界訪問.
  4. 忘記釋放記憶體或者釋放一部分.

而記憶體管理不當會導致些什么了?

1.記憶體泄露

  • 記憶體泄露是什么呢,會導致什么?
  • 記憶體泄漏也稱作"存盤滲漏",用動態存盤分配函式動態開辟的空間,在使用完畢后未釋放,結果導致一直占據該記憶體單元,直到程式結束,(其實說白了就是該記憶體空間使用完畢之后未回收)即所謂記憶體泄漏,
  • 最終結果是程式運行時間越長,占用存盤空間越來越多,最終用盡全部存盤空間,整個系統崩潰

2.越界訪問

  • 越界訪問就比較好理解了吧,學習過C語言的xdm,都知道陣列越界,若是越界訪問到陣列之外的的元素,那導致的必然是error,error,error,

3.記憶體出錯

  • 記憶體出錯這個問題,一般都是記憶體申請后沒有初始化,類比野指標,

C語言為用戶提供了很多相應的AP介面,如malloc(),realloc(),calloc(),free(),new()等函式,需要開發者進行手動管理,許多高級語言都有記憶體自動回收的機制,比如python,很遺憾,C語言沒有,也便需要我們自行解決記憶體釋放的問題


二、記憶體分類

1.堆疊區(stack)

堆疊(stack)又名堆疊,它是一種運算受限的線性表,限定僅在表尾進行插入和洗掉操作的線性表,

2.全域區

靜態區存放程式中所有的全域變數和靜態變數,程式結束后有系統釋放,

3.常量區

常量字串就是放在這里的, 程式結束后由系統釋放,

4.堆區(heap)

一般由程式員分配釋放, 若程式員不釋放,程式結束時可能由OS回收 ,分配方式類似于鏈表,


三、malloc(),calloc(),realloc()函式

這三個函式它們都能分配堆記憶體,并且回傳記憶體的首地址,如果失敗就回傳NULL

1.malloc:

函式原形:

void *malloc(
    size_t size
);

該函式會在堆上分配一個size(byte)大小的記憶體,不對記憶體進行初始化,所以其記憶體值是隨機的

示例:

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int *ptr;
	ptr = (int *)malloc(sizeof(int));
	if (ptr == NULL)
	{
		printf("memory allocation error!!");
		exit(1);
	}

	printf("請輸入一個整數 :");
	scanf("%d", ptr);

	printf("你輸入的整數是 :%d\n",*ptr);

    free(ptr);

	return 0;
}

結果:

  • 請輸入一個整數:666↓
  • 你輸入的整數是:666

2.calloc:

函式原形:

void *calloc(
    size_t number,
    size_t size
);

該函式與malloc函式幾乎一致,唯一不同是它將分配count個size大小的記憶體空間并自動初始化該記憶體空間為0,

3.realloc:

函式原型

void *realloc(
    void *memblock,
    size_t size
);

該函式可將ptr記憶體大小動態變化,增大或變小,但在某種程度,這樣的代碼段運行效率會變低,不太建議使用這個函式,

示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	int i, num;
	int count = 0;
	int* ptr = NULL;

	do
	{
		printf("請輸入一個整數(輸入-1表示結束):");
		scanf("%d", &num);
		count++;

		ptr = (int *)realloc(ptr, count *sizeof(int));
		if (ptr == NULL)
		{
			exit(1);
		}
		ptr[count - 1] = num;
	} while (num != -1);
	printf("輸入的整數分別是 :");
	for (i = 0; i < count; i++)
	{
		printf("%d ", ptr[i]);
	}
	putchar('\n');

	free(ptr);
	return 0;
}

四、strcpy(),memcpy(),memmove()函式

頭檔案:

#include <string.h>

1.strcpy:

函式原型:

char *strcpy(
  char *strDestination,
  const char *strSource
);

src所指由\0結束的字串復制到dest所指的陣列中,

注意事項:

srcdest所指記憶體區域不能重疊,且dest必須有足夠的空間來容納src的字串,src的結尾必須是'\0',回傳指向dest的指標,

2.memcpy:

函式原型:

void *memcpy(
  void *dest,
  const void *src,
  size_t count
);

src所指記憶體區域復制 count個位元組到dest所指記憶體區域,

注意事項:

函式回傳指向dest的指標和 strcpy相比,memcpy不是遇到\0就結束,而一定會拷貝n個位元組注意srcdest所指記憶體區域不能重疊,否則不能保證正確

3.memmove:

函式原型:

void *memmove(
  void *dest,
  const void *src,
  size_t count
);

函式功能:與 memcpy相同,

注意事項:

srcdest所指記憶體區域可以重疊memmove可保證拷貝結果正確,而memcpy不能保證,函式回傳指向dest的指標,

4.memset:

函式原型:

void *memset(
  void *dest,
  int c,
  size_t count
);

常用于內存空間的初始化,將已開辟記憶體空間s的首n個位元組的值設為值c,并回傳s

示例代碼:

#include<stdio.h> 
#include<string.h>
#include<assert.h> 

//模擬memcpy函式實作
void  *  MyMemcpy(void *dest, const void *source, size_t count)
{
   assert((NULL != dest) && (NULL != source));
   char *tmp_dest = (char *)dest;
   char *tmp_source = (char *)source;
   while (count--)//不判斷是否重疊區域拷貝
   	*tmp_dest++ = *tmp_source++;
   return dest;
}

//模擬memmove函式實作
void * MyMemmove(void *dest, const void *src, size_t n)
{
   char temp[256];
   int i;
   char *d =(char*) dest;
   const char *s =(char *) src;
   for (i = 0; i < n; i++)
   	temp[i] = s[i];
   for (i = 0; i < n; i++)
   	d[i] = temp[i];
   return dest;
}

int  main()
{
    //strcpy進行字串拷貝  
   //注意:  1. src字串必須以'\0'結束,  2. dest記憶體大小必須>=src
   char  a[5];
   //char  b[5] = "ABC";//字串結尾會自動的有\0 , 此處 b[4]就是'\0' 
   char  b[5];
   b[0] = 'A';
   b[1] = 'B';
   b[2] = 'C';
   b[3] = '\0';//必須加\0,否則strcpy一直向后尋找\0
   strcpy(a, b);
   printf("%s\n", a);

   //memcpy函式, 直接拷貝記憶體空間,指定拷貝的大小
   int   a2[5];
   int   b2[5] = { 1,2,3,4,5 };//不需要'\0'結束
   memcpy(a2, b2,   3 *sizeof(int)   );//指定拷貝的大小, 單位  位元組數
   printf("%d , %d  ,%d\n" , a2[0] ,  a2[1],  a2[2]);

   MyMemcpy(a2 + 3, b2 + 3,   2 * sizeof(int));
   printf("%d , %d \n", a2[3], a2[4]);

   //演示記憶體重疊的情況
   char  a3[6] = "123";
   //MyMemcpy(a3 + 1, a3, 4); //得到11111
   memcpy(a3 + 1, a3, 4);//雖然它是正確的,但是不保證,重疊拷貝應該避免使用它
   printf("%s\n", a3);

   //memmove功能與memcpy一樣,但是了考慮了重疊拷貝的問題,可以保證正確
   char  a4[6] = "123";
   //MyMemmove(a4 + 1, a4, 4);//可以保證正確
   memmove(a4 + 1, a4, 4);//可以保證正確
   printf("%s\n", a4);


   //memset比較簡單, 把記憶體區域初始化化為某個值
   char a5[6];
   memset(a5, 0, 6);
   for (int i = 0; i < 6; ++i)
   {
   	printf("%d", a5[i]);
   }

   return 0;
}

五、堆疊區(stack)

  • 由編譯器自動分配,自動釋放的記憶體區,存放函式的引數值.區域變數的值.回傳資料.回傳地址等,其主要特點為:先進后出(后進先出)
  • 在函式呼叫時,第一個進堆疊的是主函式中函式呼叫后的下一條指令(函式呼叫陳述句的下一條可執行陳述句)的地址,然后是函式的各個引數,在大多數的C編譯器中,引數是由右往左入堆疊的,然后是函式中的區域變數,
  • 生命周期與函式以及區域變數一致

六、堆區(heap)

  • 需要程式員自己手動申請,并且可以在運行時指定空間大小,并由程式員手動進行釋放,易導致記憶體泄露(memory leak)
  • 上面提到的三個函式malloc(),calloc(),realloc(),便為申請堆區記憶體所需要使用的函式,
  • 生命周期:什么時候釋放什么時候結束

堆和堆疊的比較:

  • 申請方式:

  • stack: 由系統自動分配, 例如,宣告在函式中一個區域變數 int b; 系統自動在堆疊中為b開辟空間,
  • heap: 需要程式員自己申請,并指明大小,在C中malloc函式,C++中是new運算子,
  • 如p1 = (char *)malloc(10); p1 = new char[10];
  • 如p2 = (char *)malloc(10); p2 = new char[20];
  • 但是注意p1、p2本身是在堆疊中的,
  • 申請后系統的回應:

  • 堆疊:只要堆疊的剩余空間大于所申請空間,系統將為程式提供記憶體,否則將報例外提示堆疊溢位,
  • 堆:首先應該知道作業系統有一個記錄空閑記憶體地址的鏈表,當系統收到程式的申請時,會遍歷該鏈表,尋找第一個空間大于所申請空間的堆結點,然后將該結點從空閑結點鏈表中洗掉,并將該結點的空間分配給程式,
  • 對于大多數系統,會在這塊記憶體空間中的首地址處記錄本次分配的大小,這樣,代碼中的delete陳述句才能正確的釋放本記憶體空間,
  • 由于找到的堆結點的大小不一定正好等于申請的大小,系統會自動的將多余的那部分重新放入空閑鏈表中,
  • 申請大小的限制:

  • 堆疊:在Windows下,堆疊是向低地址擴展的資料結構,是一塊連續的記憶體的區域,這句話的意思是堆疊頂的地址和堆疊的最大容量是系統預先規定好的,在 WINDOWS下,堆疊的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過堆疊的剩余空間時,將提示overflow,因 此,能從堆疊獲得的空間較小,
  • 堆:堆是向高地址擴展的資料結構,是不連續的記憶體區域,這是由于系統是用鏈表來存盤的空閑記憶體地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址,堆的大小受限于計算機系統中有效的虛擬記憶體,由此可見,堆獲得的空間比較靈活,也比較大,
  • 申請效率的比較:

  • 堆疊由系統自動分配,速度較快,但程式員是無法控制的,
  • 堆是由new分配的記憶體,一般速度比較慢,而且容易產生記憶體碎片,不過用起來最方便,
  • 另外,在WINDOWS下,最好的方式是用VirtualAlloc分配記憶體,他不是在堆,也不是堆疊,而是直接在行程的地址空間中保留一快記憶體,雖然用起來最不方便,但是速度快,也最靈活,
  • 堆和堆疊中的存盤內容:

  • 堆疊:在函式呼叫時,第一個進堆疊的是主函式中后的下一條指令(函式呼叫陳述句的下一條可執行陳述句)的地址,然后是函式的各個引數,在大多數的C編譯器中,引數是由右往左入堆疊的,然后是函式中的區域變數,注意靜態變數是不入堆疊的,當本次函式呼叫結束后,區域變數先出堆疊,然后是引數,最后堆疊頂指標指向最開始存的地址,也就是主函式中的下一條指令,程式由該點繼續運行,
  • 堆:一般是在堆的頭部用一個位元組存放堆的大小,堆中的具體內容有程式員安排,

七、全域區(靜態區)

  • 全域變數和靜態變數的存盤是放在一塊的,初始化的全域變數和靜態變數在塊區域,
  • 全域變數及靜態變數都是在整個程式運行時都一直存在的,其生命周期為程式結束

八、常量區

  • 字串常量是放在常量區,當你初始化賦值的時候,這些常量就先在常量區開辟一段空間,保存此常量,以后相同的常量就都使用一個地址,

九、常見錯誤之記憶體越界與記憶體泄露(Memory Leak)

1.記憶體越界

道理很簡單,如其名稱一樣,記憶體越界也就是你申請了一塊記憶體,但在你使用這塊記憶體的時候,你使用的范圍超出了你申請到的記憶體的范圍導致記憶體越界

  • 訪問到野指標指向的區域,越界訪問
  • 陣列下標越界訪問
  • 使用已經釋放的記憶體
  • 企圖訪問一段釋放的堆疊空間
  • 容易忽略 字串后面的'\0'

注意:

strlen所作的是一個計數器的作業,它從記憶體的某個位置(可以是字串開頭,中間某個位置,甚至是某個不確定的記憶體區域)開始掃描,直到碰到第一個字串結束符'\0'為止,然后回傳計數器值( 長度不包含’\0’),

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char  * fun()
{
   char arr[10];
    return  arr;
}//arr是堆疊記憶體,離開此花括號,堆疊被釋放回收


int main()
{
   //1.訪問到野指標指向的區域,越界訪問
   char  *p;//沒有初始化,野指標,亂指一氣
   //strcpy(p, "hello");//非法越界訪問

   //2.陣列下標越界訪問
   int   * p2 = (int *)calloc(10, sizeof(int));
   for (size_t i = 0; i <= 10; i++)
   {
   	p2[i] = i;//很難察覺的越界訪問, 下標越界
   }

   //3.使用已經釋放的記憶體
   char *p3 = (char *)malloc(10);
   free(p3);
   if (p3 != NULL)//這里if不起作用
   {
   	strcpy(p3, "hello");//錯誤,p3已經被釋放
   }

   //4.企圖訪問一段釋放的堆疊空間
   char *p4 = fun();  //p4指向的堆疊空間已經被釋放
   strcpy(p4, "hello");
   printf("%s\n",p4);

   //5.容易忽略 字串后面的'\0'
   char  *p5 = (char *)malloc(strlen("hello"));//忘記加1
   strcpy(p5, "hello");//導致p5的長度不夠,越界

   return 0;
}

2.記憶體泄露(Memory Leak)

前面相信大家都看到了free(ptr);這一簡短的代碼,其作用便是釋放我們在堆上申請的記憶體,防止程式的未釋放,造成系統記憶體的浪費,導致記憶體運行速度減慢,甚至是系統崩潰等后果

雖然現在的電腦的記憶體已經普遍較高,最低顯存現在都是8G以上,所以很多人似乎對記憶體釋放這件事并不擔心

如果你也是抱著這樣的心態:那請試試下面這行代碼hhhh

看看你的電腦能撐多久呢?

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int *ptr = NULL;
	while(1)
	{
		ptr = malloc(1024);
	}
	return 0;
}

十、記憶體碎片解決

記憶體碎片一般是由于空閑的內存空間比要連續申請的空間小,導致這些小記憶體塊不能被充分的利用,當你需要分配大的連續記憶體時,盡管剩余記憶體的總和足夠,但系統找不到連續的記憶體,所以導致分配失敗malloc/free大量使用會造成記憶體碎片

  • 碎片問題:
  • 對于堆來講,頻繁的new/delete勢必會造成記憶體空間的不連續,從而造成大量的碎片,使程式效率降低,
  • 對于堆疊來講,則不會存在這個問題,因為堆疊是先進后出的佇列,他們是如此的一一對應,以至于永遠都不可能有一個記憶體塊從堆疊中間彈出,在他彈出之前,在他上面的后進的堆疊內容已經被彈出,

解決方法:

  • 記憶體池技術
  • 記憶體的申請、釋放是低效的,我們只在開始申請一塊大內存(不夠繼續申請),然后每次需要時都從這塊記憶體取出,并標記這塊記憶體是否被使用,釋放時僅僅標記而不真的free,只有記憶體都空閑的時候,才釋放給作業系統,這樣減少了 mallocfree次數,從而提高效率,

設計思路:

  • 先分配幾個大的連續記憶體塊(MemoryBlock),每個記憶體塊用鏈表鏈接起來,然后通過一個內存池結構(MemoryPool)管理,
  • 詳細看https://blog.csdn.net/u014779536/article/details/116354403?utm_source=app這篇文章

總結

文章內容大部分來源于百度,CSDN,以及視頻以下為這些資料的鏈接,在這里統一貼出來

  1. https://blog.csdn.net/u014779536/article/details/116354403?utm_source=app
  2. https://blog.csdn.net/qq_34793133/article/details/85713413
  3. https://fishc.com.cn/forum.php?mod=viewthread&tid=35614&highlight=%C4%DA%B4%E6
  4. 百度:https://baike.baidu.com/item/%E6%A0%88/12808149?fr=aladdin,https://baike.baidu.com/item/%E5%A0%86/20606834?fr=aladdin
  5. 視頻:https://www.bilibili.com/video/BV1jW411K7yg?from=search&seid=18059219221845422969
  6. 看到這里十分感謝

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/283160.html

標籤:AI

上一篇:RRT演算法的一種關于最終路徑的創新matlab仿真

下一篇:學習系統呼叫介面

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more