

倚天照海花无数,流水高山心自知。
不会吧
#include <stdio.h>
#include <stdlib.h>
void main()
{
int *p=NULL,m,*q=NULL;
int n=0,i;
p=q=(int *)malloc(2*sizeof(int)); //申请存放个数和结束标志空间
// p++;
while(scanf("%d",&m)!=0) //输入字符则结束循环,也就是输入任何字母结束输入
{
q=(int *)realloc(q,sizeof(int));
p++;
*p=m;
n++;
}
*q=n; //动态数组第一个元素为数字个数
for(i=0;i<=n;i++)
printf("%d ",*(q+i));
}
输入 1 2 3 4 5 e(任何一个字母代表结束)
输出 5 -33686019 2 3 4 5
相关函数:malloc, calloc, free, brk
表头文件:#Include <stdlib.h>
函数定义:void *realloc(void *ptr, size_t size)
函数说明:参数ptr为指向先前由malloc()、calloc()、realloc()所返回的内存指针, 而参数size()为新配置的内存大小 ,其值可比原内存大或小。 若小,内存内容并不会改变,且返回指针为原来内存启起地址;但若大,则realloc()不一定会返回原先的指针,原先的内容虽不会改变,但新多出的内存则未设置初值。若是参数ptr指针为NULL,则调用相当于malloc(size);若参数size为0, 此调用相当于free(ptr)
返回值 :成功返回指针, 失败返回NULL
范例:
#Include <stdlib.h>
main()
{
char *ptr1=malloc(10);
char *ptr2;
memset(ptr1, 'A', 10);
*(ptr1+10)='\0';
printf("before realloc: ptr= %x [%s]\n", ptr1, ptr1);
ptr2=realloc(ptr1, 40960);
printf("after realloc: ptr= %x [%s]\n", ptr2);
}
realloc 可以对给定的指针所指的空间进行扩大或者缩小,无论是扩张或是缩小,原有内存的中内容将保持不变。当然,对于缩小,则被缩小的那一部分的内容会丢失。realloc 并不保证调整后的内存空间和原来的内存空间保持同一内存地址。相反,realloc 返回的指针很可能指向一个新的地址。
所以,在代码中,我们必须将realloc返回的值,重新赋值给 p :
p = (int *) realloc (p, sizeof(int) *15);
甚至,你可以传一个空指针(0)给 realloc ,则此时realloc 作用完全相当于malloc。
int* p = (int *) realloc (0,sizeof(int) * 10); //分配一个全新的内存空间,
这一行,作用完全等同于:
int* p = (int *) malloc(sizeof(int) * 10);
终于搞好了
题目是输入一组数字,存放在动态数组,数组第一个元素是输入数字个数,输入时以字母结束输入:
#include <stdio.h>
#include <stdlib.h>
#define M 10
void main()
{
int *p=NULL,m;
int n=0,i=0;
p=(int *)malloc(sizeof(int)); //申请存放个数和结束标志空间
*p=NULL;
while(scanf("%d",&m)!=0) //输入字符则结束循环
{
i++;
n++;
p=(int *)realloc(p,(1+n)*sizeof(int));
p[i]=m;
}
*p=n; //动态数组第一个元素为数字个数
for(i=0;i<=n;i++)
printf("%d ",*(p+i));
}