按输入整型数量分配内存

输入任意多的整数,以EOF结束;

目的:使数组分配到的内存刚好为输入整数的总数量+1;其中第一个元素为输入整数的总数量,其后的元素为输入的整数;

输入:

1 3 5 4 6 7

输出:

6 1 3 5 4 6 7

有一些关于堆和栈的基础知识:

函数体内声明数组最大为2M左右,而用动态分配则没有这个限制!!!

堆(Heap)栈(Stack)

一、预备知识—程序的内存分配

一个由c/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放

4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区—存放函数体的二进制代码。

例子程序

//main.cpp

int a = 0; 全局初始化区

char *p1; 全局未初始化区

main()

{

int b; 栈

char s[] = "abc"; 栈

char *p2; 栈

char *p3 = "123456"; 123456\0在常量区,p3在栈上。

static int c =0; 全局(静态)初始化区

p1 = (char *)malloc(10);

p2 = (char *)malloc(20);

分配得来得10和20字节的区域就在堆区。

strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。

}

附上代码:

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
#define ms(x,y) memset(x,y,sizeof(x))
const int MAXN=100;
const int INF=1<<30;
using namespace std;

int *input()
{
	int *p = (int *)malloc(MAXN * sizeof(int));//先分配MAXN个int
	if(p == NULL) return NULL;
	int count = 1;
	while(scanf("%d", p+count)==1){
		count++;
		if(count >= MAXN){//输入的数量>=MAXN,在原内存块尾部增加1个int
			p = (int *)realloc(p, (count+1) * sizeof(int));
			if(p == NULL) return NULL;
		}
	}
	if(count < MAXN)//输入数量<MAXN,在原内存块尾部删除多余的内存
		p = (int *)realloc(p, count * sizeof(int));
	p[0] = count-1;
	return p;
}

int main()
{
	//freopen("in.txt","r",stdin);
	int *p = input();
	if(p == NULL){
		printf("malloc failure\n");
		exit(1);
	}
	printf("%d", p[0]);
	for(int i=0; i<p[0]; i++){
		printf("% d", p[i+1]);
	}
	printf("\n");
	return 0;
}
时间: 2024-11-05 01:53:29

按输入整型数量分配内存的相关文章

整型反序

简要描述:给出一个不多于5位的整数, 进行反序处理 要求: 1.求出它是几位数 2.分别输出每一位数字 3.按逆序输出各位数字,例如原数为321,应输出123(仅数字间以空格间隔, 负号与数字之间不需要间隔) 例如:输入:12345 输出:5 1 2 3 4 5 54321 注意:如果是负数,负号加在第一个数字之前, 与数字没有空格间隔 比如 输入:-12345 输出:5 -1 2 3 4 5 -54321 函数原型: /* 输入: iInput: 位数不大于5的整数 输出: iNum:   整

2015华为机试—— 输入整型数组和排序标识,对其元素按照升序或降序进行排序

接口说明 原型: void sortIntegerArray(Integer[] pIntegerArray, int iSortFlag); 输入参数: Integer[] pIntegerArray:整型数组 int  iSortFlag:排序标识:0表示按升序,1表示按降序 输出参数: 无 返回值: void 这题比较简单,也没什么思路好说,直接看代码 代码如下: public final class Demo { // 功能:输入整型数组,对其元素按照升序或降序进行排序 // 输入:pI

关于指针 用字符数组,字符指针变量输入字符串 动态为字符型指针变量分配内存

#include <stdio.h> #include <iostream> #include<math.h> using namespace std; int main() { //声明字符型数组和指针变量 char str[10]; char *strip=str; //输入输出 cout<<"str="; cin>>str; //用字符数组输入字符串 cout<<"str="<<

异常处理:从命令行输入5个整数,放入一整型数组,然后打印输出。。。

从命令行输入5个整数,放入一整型数组,然后打印输出.要求: 如果输入数据不为整数,要捕获输入不匹配异常,显示"请输入整数":如果输入数据多余5个,捕获数组越界异常,显示"请输入5个整数". 无论是否发生异常,都输出"感谢使用本程序!" import java.util.InputMismatchException;import java.util.Scanner; public class ExceptionTest2 { public stat

输入一个整型数组,数组里有正数,也有负数。求所有子数组的和的最大值

题目: 输入一个整型数组,数组里有正数,也有负数. 数组中一个或连续的多个整数组成一个子数组. 求所有子数组的和的最大值.要求时间复杂度为 O(n). 解答: 1 public class Solution { 2 public static void main(String[] args) { 3 int[] arr = {1,-2,3,10,-4,7,2,-5}; 4 System.out.println(maxSub(arr)); 5 } 6 7 private static int ma

从键盘输入一个十进制整型数据,计算并输出其各位上数字之和(忽略正负号)。

/* 从键盘输入一个十进制整型数据,计算并输出其各位上数字之和(忽略正负号). 例如,输入1234,输出10:输入-1234,输出10. */ #include <stdio.h> #include <string.h> #include<math.h> int abs(int n){ if(n>0) return n; return -n; } int main() { int n,sum=0; scanf("%d",&n); n=a

C语言的整型溢出问题(转)

整型溢出有点老生常谈了,bla, bla, bla… 但似乎没有引起多少人的重视.整型溢出会有可能导致缓冲区溢出,缓冲区溢出会导致各种黑客攻击,比如最近OpenSSL的heartbleed事件,就是一个buffer overread的事件.在这里写下这篇文章,希望大家都了解一下整型溢出,编译器的行为,以及如何防范,以写出更安全的代码. 什么是整型溢出 C语言的整型问题相信大家并不陌生了.对于整型溢出,分为无符号整型溢出和有符号整型溢出. 对于unsigned整型溢出,C的规范是有定义的——“溢出

C++ 内存、new与malloc分配内存区别?

一关于内存 1.内存分配方式 内存分配方式有三种: (1)从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2)在栈上创建.在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. (3) 从堆上分配,亦称动态内存分配.程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或de

分配内存(Linux设备驱动程序)

分配内存 介绍设备驱动程序中使用内存的方法: 如何最好地利用系统内存资源. kmalloc函数 kmalloc内存分配引擎是一个功能强大的工具. #include <linux/slab.h> void *kmalloc(size_t size, int flags); 参数分配表示flags能够以多种方式控制kmalloc的行为. 标志GFP_KERNEL表示内存分配是代表运行在内核空间的进程执行的,这意味着调用它的函数正代表 某个进程执行系统调用. 使用GFP_KERNEL允许kmallo