c语言栈同时存储float和char,C语言学习—动态内存分配

本文详细介绍了C/C++中的内存区划分(栈、堆、静态区、常量区和代码区),动态内存分配(malloc、calloc、realloc)及其注意事项,包括内存操作函数如memset、memcpy和内存管理技巧。通过实例演示如何动态创建数组并找出最大值,以及高效存储文本中的单词。
摘要由CSDN通过智能技术生成

一. 存储区划分(地址由高到低)

栈区

int a = 3;

堆区

malloc(255)

静态区

static float h = 1.36

常来区

"sdk"

代码区

void func(){...}

注意:

栈内存:栈内存返回是不安全的,禁止!!!

常量区:常量占用内存,只读状态,决不可修改!

静态存储区:1.只初始化一次

2.如果初始化没值,默认值0

3.只有程序退出才释放

将变量定义的类型前加static,则该变量存储在静态存储区

堆区:手动分配,手动释放

代码区:所有的语句编译后会生成CPU指令存储在代码区

二.堆内存分配函数

动态内存分配

void *malloc(unsigned int size);

*返回分配完的内存的首地址,size需要分配的字节数,因是参数,可以写成表达式.可以根据需求运行期分配内存.

malloc使用

1. char *str = malloc(8);

strcpy(str, "sdf");使用刚刚分配的内存,存储数据

2. int *arr = malloc(4);

short *sarr = malloc(4);

arr分配一块内存可存放一个int型元素,sarr可存放两个short型元素

3. Student *p = malloc(sizeof(Student));

Student *p = malloc(sizeof(Student)*5);

分配一个结构体内存和分配一个结构体数组的内存

内存释放

void free(void *);

free函数作用是释放内存,内存释放是标记删除.

三.其他内存分配函数

calloc

void * calloc(unsigned n,unsigned size);

分配n个size大小的空间,并且把该内存上的所有字节清零

realloc

void *realloc(void *p, unsigned newSize);

按给定的地址以及给定的大小重新分配

四. 内存操作函数

初始化内存

从s指向的内从开始初始化n个字节的内容为c

void *memset(void *s, int c, size_t n);

内存拷贝

从source指向的内存开始拷⻉贝到dest,拷⻉贝n个字节

void *memcpy(void *dest, const void *source, size_t n);

内存比较

int memcmp(const void *buf1, const void *buf2, unsigned int count);

⽐比较buf1和buf2指向的内存是否相同,⽐比较count个字节

练习代码:

1.输入一个数组长度,动态创建数组,所有元素随机生成,输出元素中的最大值。

int main()

{

int x = 0;

scanf("%d", &x);//输入数组长度

//动态分配

int *p = malloc(sizeof(int) * x);

int *head = p;//指向数组的首地址

//生成随机数,保存在数组中

for (int i = 0; i 

*p ++ = arc4random() % (40 - 20 + 1) + 20;

}

int max = 0;//用于保存最大值

for (int i = 0; i 

//查找最大值

if (max 

max = head[i];

}

//输出数组

printf("%d ", head[i]);

}

//输出最大值

printf("\nmax = %d ", max);

//释放空间

free(head);

//指针置空

head = NULL;

p = NULL;

return 0;

}

2.有一段文本,将文本中的所有单词,存放到一个字符串数组中。(要求占用内存最少)

int main()

{

char str[] = "s    sdfs   sdf   af asfadsf    ads f asd fa sdf as ddbv";

char tempStr[20] = {0};//暂存单词

char *p[255] = {0};//存储栈区空间地址

int i = 0;//str下标

int j = 0;//tempStr下标

int k = 0;//指针数组下标

while (1) {

//获取一个单词

if (str[i] != ' ' && str[i] != '\0') {

tempStr[j ++] = str[i];

//一个单词结束

} else if (j != 0){

//当遇到空格,或者\0时,单词的存放结束

tempStr[j] = '\0';

p[k] = malloc(strlen(tempStr) + 1);

strcpy(p[k], tempStr);

k ++;

j = 0;//存储下一个单词

}

//while出口,str被遍历完成

if (str[i] == '\0') {

break;

}

i ++;//移动str数组中的下一个元素

}

for (int i = 0; i 

printf("%s ", p[i]);

free(p[i]);

p[i] = NULL;

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值