C和指针 (pointers on C)——第十一章:动态内存分配(下)习题

1、编写calloc,内部用malloc。

void *calloc (size_t n, size_t size)
{
	char * memory;
	memory =(char*) malloc(n * size);
	while( memory != NULL)
	{
		char * ptr;
		ptr = memory;
		while ( --n >= 0)
		{
			*ptr++ = '\0';
		}
	}
	return memory;

}

2、编写一个函数,动态存储一列输入的整数。

#include <stdlib.h>

int * readints()
{
	int *array;
	int value;
	int length = 1;
	array = (int *) malloc(length * sizeof(int));
	if (array == NULL)
	{
		return NULL;
	}
	while ( scanf_s("%d", &value) == 1)
	{
		length++;
		array =(int *) realloc(array,  length * sizeof(int));
		if (array == NULL)
		{
			return NULL;
		}
		array[length-1] = value;
	}
}

3、编写一个函数,动态存储一列输入的char。

#include "stdlib.h"

char * readstring()
{
	char *array;
	char *ptr;
	int length = 1;
	array = (char *) malloc (sizeof(char));
	gets(ptr);
	if (ptr == NULL)
	{
		exit (EXIT_FAILURE);
	}
	while (*ptr != NULL )
	{
		length++;
		array  = (char *) realloc (array , length * sizeof(char));
		if (array == NULL)
			exit (EXIT_FAILURE);
		array[length - 1] = *ptr;
		ptr++;
	}
	//追加一个NUL
	array  = (char *) realloc (array , (length++) * sizeof(char));
	if (array == NULL)
		exit (EXIT_FAILURE);
	array[length - 1] = '\0';
	return array;
}
时间: 2024-08-08 22:05:31

C和指针 (pointers on C)——第十一章:动态内存分配(下)习题的相关文章

C和指针 (pointers on C)——第十一章:动态内存分配(上)

第十一章 动态内存分配 数组在声明的时候,本身作为一个指针常量,它在编译时候内存就已经被分配好了.但是有时候程序不知道这个数组到底有多长,所以,为了防止内存的浪费,C提供了动态内存分配的策略. 其实,作为独立的一章,本章显得内容不多.malloc,free,calloc,realloc就没有了,但是它包含很多用法,也有很多陷阱. 总结: malloc和calloc函数都用于动态分配一块内存,并返回一个指向该块内存的指针.malloc返回的是一个 void *的指针. malloc的参数就是需要分

C++学习笔记(十一):void*指针、类型转换和动态内存分配

void*指针 void关键字表示“空类型”的概念.但是,这里的“空类型”不表示“任意类型”,而是表示不存在的意思,也就是说C/C++不允许你写语句void a,不存在类型为void的东西. void*表示“空类型指针”,与void不同,void*表示“任意类型的指针”或表示“该指针与一地址值相关,但是不清楚在此地址上的对象的类型”. 类型转换 C风格转换: 1 int i; 2 double d; 3 4 i = (int) d; 5 //或 6 i = int (d); C风格转换在C++中

指针 &amp;&amp; 动态内存分配

C++中的动态内存分配机制 c++中使用new和delete来完成在堆上对动态内存的分配和释放. 注.所有指针都应该被初始化 如果指针指向的动态内存被释放或没有指向合法的地址,就应该将指针设置为nullptr,否则内存泄漏. 变量: double* pvalue {}; pvalue=new double; *pvalue=9.0; 或 double* pvalue {}; pvalue=new double {9.0}; 或合并为一句 double* pvalue {new double{9.

动态内存分配与指向它的指针变量

1.动态内存分配的含义 c语言允许建立动态内存分配区域,以存放一些临时用的数据,这些数据不必再程序的声明部分定义,也不必等到函数结束时才释放,而是要随时开辟,不需要随时释放,这些数据是临时存放在一个特定的自由存储区(堆),可以根据需要向系统申请所需要大小的空间,由于未在声明部分定义它们为变量或数组,因此不能通过变量名或数组名去引用这些数据,只能通过指针来引用. 2.建立内存的动态分配 对内存的动态分配是通过系统提供的函数库来实现的,主要有malloc,calloc,free,realloc这四个

指针做参数的动态内存分配与二重指针(上)

C中的动态内存分配问题: 格式:Int *pointer; Pointer = (int *)malloc(100 * sizeof(int)); 可以在被调用函数(该函数返回指针的函数)中动态分配内存,(并且该内存是分配在堆内存中的,故而被调函数可以返回指向该堆内存的指针),然后返回该指针值,该指针指向动态分配的内存,然后可以在主函数中free掉pointer.哪怕在主函数中将该指针值赋值给pointer_2,free掉pointer_2也是可以的,(可以理解的,它们都指向该堆内存),以避免出

C和C指针小记(十六)-动态内存分配

动态内存分配 1.1 为什么使用动态内存分配 直接声明数组的方式的缺点: 1) 声明数组必须指定长度限制.无法处理超过声明长度的数组. 2) 如果声明更大的常量来弥补第一个缺点,会造成更多的内存浪费. 3)如果输入数组的数据超过来数组的容纳范围,程序必须以一种合理的方式作出响应.但是程序员一般不会做这个判断. 1.2 malloc 和 free malloc 和 free 分别用于执行动态分配内存和释放. stdlib.h 中声明来这两个函数的原型 void malloc( size_t siz

未解决问题:指针作参数、二重指针、指针数组、动态内存分配

题目:输入m个学生n门课的成绩,计算每个学生的平均成绩,输入学生编号后输出该学生各门课的成绩. 先直接上源码:(有错误的源码) #include <stdio.h> #include <stdlib.h> #include <stdbool.h> int **pointer_counterpart = NULL; int main() { void Input_number(int *m, int *n); //输入m个学生n门课成绩 void allocation(i

指针做参数的动态内存分配与二重指针(下)

要实现指针作为函数形参,改变实参指针的值.一般有两种做法: 使用双指针,或者指针数组形式作为形参,将实参的地址传入函数,也即要给形参传入指针的地址! http://blog.csdn.net/liuyajun2013/article/details/17151309#0-tsina-1-79483-397232819ff9a47a7b7e80a40613cfe http://www.cnblogs.com/heat-man/p/4646051.html http://www.jb51.net/a

第十二章 动态内存与智能指针

动态内存与智能指针 [智能指针]头文件#include<memory>shared_ptr: 允许多个指针指向同一个对象unique_ptr: "独占"所指向的对象weak_ptr:伴随类,它是一种弱引用,指向shared_ptr所管理的对象. 原文地址:https://www.cnblogs.com/sunbines/p/8552298.html