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静态库)。

 

时间: 2025-01-20 14:43:48

malloc,colloc,realloc内存分配,动态库,静态库的生成与调用的相关文章

[c/c++]关于linux下动态库/静态库的基础问题

问题描述 [c/c++]关于linux下动态库/静态库的基础问题 本人小白,自学没多久,有几个问题一直没搞太明白,望高手解答! 假如我写了一个动态库libmylib.so(我有函数声明mylib.h),里面用到了A同学写的动态库liba.so(我有声明a.h),现在我要在一个新的程序test.cpp里调用我写的mylib.so 问题: 1.test.cpp的头文件需要两个.h都包含还是只要mylib.h? 2.用g++链接时 -lmylib -la都需要吗? 3.假如有一天liba.so文件丢失

动态库 静态库-linux动态库静态库问题,大牛请进

问题描述 linux动态库静态库问题,大牛请进 /////// static.h void static_print(); ///////static.cpp #include #include "static.h" void static_print() { std::cout<<"This is static_print function"< } ////// shared.h void shared_print(); ////// share

【C/C++学院】0801-重定向以及文件扫描/二进制加密解密/简单加密/按照密码加密/动态库与静态库

重定向以及文件扫描 #define _CRT_SECURE_NO_WARNINGS//关闭安全检查 #include<stdio.h> #include<stdlib.h> void main1() { char str[100] = { 0 }; scanf("%s", str); printf("str=%s\n", str); system(str); } void main2() { char str[100] = { 0 }; fs

动态内存分配的C代码示例

概述 之前有同学在QQ上问我,C语言中的动态内存分配是怎么回事. 首先,我们来看看内存分配的概念,它是指在程序执行的过程中分配或者回收存储空间的方法.一般说来,内存分配方法分为静态内存分配和动态内存分配两种.在本文中,我们主要讨论动态内存分配. 要实现动态内存分配,就需要有执行这个操作的对象.C语言考虑得很周到,它为我们提供的两个标准库函数:malloc和free. malloc和free函数简介 malloc函数 原型:void *malloc(size_t size); 简介:该函数在内存的

Linux静态库和动态库的编写和使用

Linux静态库和动态库的编写和使用 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种.   1  静态库和动态库的区别 1.1. 静态函数库    (1)静态函数库的名字一般是lib[name].a (2)利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,它的优点是编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了.这给它带来的缺点为如果静态函数库改变了,那么你的程序必须重新编译. 1.2. 动态

Linux系统中“动态库”和“静态库”那点事儿【转】

转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情.       在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式.ELF(Executable and Linking Format,可执行连接格式)是UNIX系统实验室(USL)作为应

Linux下生成使用动态库和静态库

Linux中有两类函数库,动态库和静态库 静态库: 这类库一般都是以.a为后缀名的文件,利用静态库函数编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中. 编译后的执行程序就不需要外部的函数库支持,但也有其缺点,就是一旦静态函数库改变了,那么程序就必须重新编译. 动态库: 这类库的一般都是以.so为后缀名的,相对于静态库函数库来说,动态函数库在编译的时候并没有被编译进目标代码中.当程序执行到相关函数时才调用该函数库里的相应函数,因此动态库函数库所产生的可执行文件比较小,由于函数库

关于C语言程序的内存分配的入门知识学习_C 语言

C语言程序的存储区域 C语言编写的程序经过编绎-链接后,将形成一个统一的文件,它由几个部分组成,在程序运行时又会产生几个其他部分,各个部分代表了不同的存储区域: 代码段(Code or Text):代码段由程序中的机器码组成.在C语言中,程序语句进行编译后,形成机器代码.在执行程序的过程中,CPU的程序计数器指向代码段的每一条代码,并由处理器依次运行. 只读数据段(RO data):只读数据段是程序使用的一些不会被更改的数据,使用这些数方式类似查表式的操作,由于这些变量不需要更改,因此只需要放置

C++ QVector 类介绍及内存分配策略

QVector 介绍 QVector类是一个提供动态数组的模板类. QVector<T>是Qt普通容器类的一种.它将自己的每一个对象存储在连续的内存中,可以使用索引号来快速访问它们.QList<T>.QLinkedList<T>和 QVarLengthArray<T>也提供了相似的功能,它们使用方法如下: l QList一般用得最多,它能满足我们绝大部分需求.像prepend()和insert()这样的操作通常比QVector要快些,这是由于QList存储它