malloc,colloc,realloc內存分配,動態庫,靜態庫的生成與調用
1.在main方法裏面直接定義一個很大的數組的時候。可能會出現棧溢出:錯誤代碼演示:
#include<stdio.h>
#include<stdlib.h>
void main()
{
int a[1024 * 1024];
int num = 100;
system("pause");
}
錯誤截圖:
2.在定義數組的時候要定義數組的長度,否則會出現錯誤。
(特例:在GCC編譯器下,不會出現錯誤(由於標準不一樣))。
3.打印而且賦值的是:
for (int i = 0; i < length;i++)
{
printf("%d\n",a[i] = i); //初始數組並打印
}
4.內存分配能夠通過三個函數實現
A.void *malloc(size_t size):malloc僅僅管分配,不初始化內容(size:Bytes to allocate:分配的字節數)。
B.void *calloc(size_t,size_t size):分配內存,而且初始化內存信息為0,其有兩個參數(num:Number of elements;size:Length in bytes of each element),第一個參數是,開辟的數量,第二個參數是每一個參數的大小。
C.void *realloc(void *memblock,size_t size);Reallocatememory blocks;
memblock:Pointer to previously alloctedmemory block;
size:New size in bytes
比如:
int *p1 = (int*)malloc(sizeof(int)*10);//僅僅管分配。不初始化
int *p2 = (int*)calloc(10,sizeof(int));//calloc會進行內存清零
樣例:
#include<stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
//僅僅管分配
int *p1 = (int *)malloc(sizeof(int)* 10);
//calloc會進行內存清零
int *p2 = (int *)calloc(10, sizeof(int));
printf("%p,%p", p1, p2);
for (int i = 0; i < 10; i++)
{
p1[i] = i;
p2[i] = i;
}
getchar();
return 0;
}
5.realloc分配內存
#include <stdio.h>
#include<stdlib.h>
void main()
{
//分配內存
int *p = (int *)calloc(10,sizeof(int));
printf("%p\n", p);//輸出地址
int i;
for (i = 0; i < 10;i++)
{
//*(p + i)等價於p[i]
*(p + i) = i;
}
//變長,第一個參數是指針地址。第二個參數表示的是數組的個數
int *pnew = (int *)realloc(p,100000);
//realloc.第一種情況,後面的內存沒實用,就直接擴展變長
//另外一種情況。後面的內存有人用,先分配新的長度,拷貝原來原來的內存,釋放原來的內存
printf("%p",pnew);
for (int i = 10; i < 25000;i++)
{
*(pnew + i) = i;
}
system("pause");
return 0;
}
6.新建項目dlllib
編寫代碼:
#include<stdio.h>
#include<stdlib.h>
void go()
{
printf("Hello World\n");
}
7.制作dll,右擊項目à屬性à配置屬性à常規à分別改動配置類型(動態庫.dll)和目標文件名稱。
8.制作lib,右擊項目à屬性à配置屬性à常規à分別改動配置類型(動態庫.lib)和目標文件名稱。
9.引入lib.lib的方式有
A:將.lib復制到源碼所在的文件夾下。à通過代碼引入.lib。
代碼是:
#pragma comment(lib,”test.lib”); //當中test.lib就是要引入的.lib靜態庫(註意,也要將靜態庫相應的.h放到源文件所在的位置)。
B:將.lib復制到源碼所在的文件夾下。
à通過配置的方式引入靜態庫。
方式是:
右擊項目à屬性à配置屬性à輸入à附加依賴項(如現有依賴項加入的方式加入.lib靜態庫)。
malloc,colloc,realloc內存分配,動態庫,靜態庫的生成與調用