C 语法 - 08_动态内存申请

// malloc.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

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

//malloc函数,申请堆区空间,不自动清0。
void test01()
{
	int* p = NULL;
	p = (int*)malloc(sizeof(int));   //空间申请

	if (p == NULL)
	{
		return;
	}

	*p = 100;
	printf("*p = %d\n", *p);

	free(p);       //空间释放

}
void test02()
{
	int n = 0;
	printf("请输入int元素的个数\n");
	scanf("%d", &n);

	int* p = NULL;
	p = (int*)malloc(n * sizeof(int));  //根据元素个数申请空间
	if (p == NULL)
	{
		return;
	}

	//将堆区空间清0
	memset(p, 0, n * sizeof(int));

	//测试空间内容
	for (int i = 0; i < n; i++)
	{
		printf("%d ", *(p + i));
	}
	printf("\n");

	//空间内容赋值
	for (int i = 0; i < n; i++)
	{
		scanf("%d", p + i);
	}

	//遍历数组元素
	for (int i = 0; i < n; i++)
	{
		printf("%d ", *(p + i));
	}
	printf("\n");

	free(p);      //空间释放

}


//calloc函数,申请堆区空间,自动清0。
//开辟堆区空间,没有名字
void* my_get_addr(int n, int elem_size)
{
	return calloc(n, elem_size);

}
//给堆区内容赋值一星
void my_get_intput_arr01(int n, int* q)
{
	for (int i = 0; i < n; i++)
	{
		//q = p;
		//q + i = p + i;
		scanf("%d", q + i);
	}
}
//给堆区内容赋值二星
void my_get_intput_arr02(int n, int** q)
{
	for (int i = 0; i < n; i++)
	{
		//q = &p;
		//*q = p;
		//*q + i = p + i;
		scanf("%d", *q + i);
	}

}
//输出堆区内容
void my_printf_arry(int n, int* q)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", *(q + i));
	}
}
void test03()
{
	int n = 0;
	printf("请输入int元素的个数\n");
	scanf("%d", &n);

	int* p = NULL;
	p = (int*)my_get_addr(n, sizeof(int));
	if (p == NULL)
	{
		return;
	}

	my_get_intput_arr01(n, p);
	//my_get_intput_arr02(n, &p);

	my_printf_arry(n, p);

	free(p);

}

//realloc函数,申请追加堆区空间。
void test04()
{
	int n = 0;
	printf("请输入int元素的个数\n");
	scanf("%d", &n);

	int* p = NULL;
	p = (int*)calloc(n, sizeof(int));
	if (p == NULL)
	{
		return;
	}

	//获取键盘输入
	for (int i = 0; i < n; i++)
	{
		scanf("%d", p + i);
	}

	//输出内容
	for (int i = 0; i < n; i++)
	{
		printf("%d ", *(p + i));
	}
	printf("\n");

	printf("请输入你要新增的元素个数:");

	int new_n = 0;
	scanf("%d", &new_n);

	//追加空间
	p = (int*)realloc(p, (n + new_n) * sizeof(int));

	//for (int i = 0; i < new_n; i++)
	//{
	//	scanf("%d", p + n + i);
	//}
	for (int i = n; i < n + new_n; i++)
	{
		scanf("%d", p + i);
	}

	for (int i = 0; i < n + new_n; i++)
	{
		printf("%d ", p[i]);
	}
	printf("\n");

	free(p);
}

void test05()
{
	char str1[] = "hello world";

	const char* str2 = "hello world";

	char* str3 = (char*)malloc(128);

	strcpy(str3, "hello world");

	printf("%s\n", str3);

	free(str3);

}

//内存大小
void fun(char* str4)
{
	printf("%d\n", sizeof(str4));
}
void test06()
{
	char a;
	int b;
	char str1[] = "hello";
	const char* str2 = "hello";
	char* str3 = (char*)malloc(128);

	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(b));
	printf("%d\n", sizeof(str1));
	printf("%d\n", sizeof(str2));
	printf("%d\n", sizeof(str3));
	fun(str1);

}

//标准内存释放
void test07()
{
	int* p = NULL;
	p = (int*)calloc(1, sizeof(int));

	*p = 100;
	printf("*p = %d\n", *p);

	if (p != NULL)
	{
		free(p);
		p = NULL;
	}

}

void test08()
{
	char* p = (char*)calloc(1, 128);
	strcpy(p, "hello world");

	free(p);
	p = NULL;
	printf("%s\n", p);

}

int main()
{
	test08();

}


//拓展:2星指针申请堆区空间方法,想要开辟的数组空间 hitPoint[num][3]
double** hitPoint = NULL;
int num = 6;
{
	//申请 double**类型 总的堆区空间
	hitPoint = (double**)calloc(num, 3 * sizeof(double));

	for (int i = 0; i < num; i++)
	{
		//申请每个子 double*类型 的堆区空间
		hitPoint[i] = (double*)calloc(3, sizeof(double));

		//在堆区空间存储数据
		hitPoint[i][0] = 1 + i * 10;
		hitPoint[i][1] = 2 + i * 10;
		hitPoint[i][2] = 3 + i * 10;
	}
}

//打印验证结果
for (int i = 0; i < num; i++)
{
	myPrint(hitPoint[i][0]).myPrint(hitPoint[i][1]).myPrint(hitPoint[i][2]);
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值