// 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]);
}
C 语法 - 08_动态内存申请
于 2023-01-08 14:16:07 首次发布