内存分配-关于使用realloc函数的问题

问题描述

关于使用realloc函数的问题

小弟今天写了一个函数,目的很简单:
把输入的指针里面的内容重新排序后去掉后面perc%个数。
可是在使用realloc的时候一直提示我“windows在.exe中触发了一个断点“,不知道是不是访问越界了,小弟愚笨,调试了两个小时都没有调好,特向各位请教,不知道我这么写有没有什么问题。

 void maxdt(double *input, int size, double perc)
{
    sort(input, size);
    input=(double*)realloc(input,sizeof(double)*(int)(size-size*perc/100));
}

解决方案

input指向新的地址,这个没用,实参的指针不会被修改的。
需要用
void maxdt(double **input, int size, double perc)
{
sort(*input, size);
input=(double)realloc(input,sizeof(double)*(int)(size+size*perc/100));
}
调用者加上取地址符号。

解决方案二:

malloc用于申请一段新的地址,参数size为需要内存空间的长度,如:
char* p;
p=(char*)malloc(20);

calloc与malloc相似,参数sizeOfElement为申请地址的单位元素长度,numElements为元素个数,如:
char* p;
p=(char*)calloc(20,sizeof(char));
这个例子与上一个效果相同

realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度
如:
char* p;
p=(char*)malloc(sizeof(char)*20);
p=(char*)realloc(p,sizeof(char)*40);

时间: 2024-10-06 10:03:41

内存分配-关于使用realloc函数的问题的相关文章

指针-一个动态内存分配的问题,函数执行后p指向哪里?

问题描述 一个动态内存分配的问题,函数执行后p指向哪里? 一下是我的代码: #include<stdio.h> #include<stdlib.h> #include<string.h> char *strcnp(char *sd,char *ds) { char *q=sd; while((*ds++=*sd++)!='') NULL; return q; } int main() { char *a[4]={"abc","def&quo

malloc,colloc,realloc内存分配,动态库,静态库的生成与调用

 1.在main方法里面直接定义一个非常大的数组的时候,可能会出现栈溢出:错误代码演示: #include<stdio.h> #include<stdlib.h> void main() {     int a[1024 * 1024];     int num = 100;     system("pause"); } 错误截图: 2.在定义数组的时候要定义数组的长度,否则会出现错误.(特例:在GCC编译器下,不会出现错误(因为标准不一样)). 3.打印并

Linux内核中常见内存分配函数(三)

ioremap void * ioremap (unsigned long offset, unsigned long size) ioremap是一种更直接的内存"分配"方式,使用时直接指定物理起始地址和需要分配内存的大小,然后将该段 物理地址映射到内核地址空间.ioremap用到的物理地址空间都是事先确定的,和上面的几种内存 分配方式并不太一样,并不是分配一段新的物理内存. ioremap多用于设备驱动,可以让CPU直接访问外部设备的IO空间.ioremap能映射的内存由原有的物理

Linux内核中常见内存分配函数(二)

常用内存分配函数 __get_free_pages unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order) __get_free_pages函数是最原始的内存分配方式,直接从伙伴系统中获取原始页框,返 回值为第一个页框的起始地址.__get_free_pages在实现上只是封装了alloc_pages函 数,Linux培训 从代码分析,alloc_pages函数会分配长度为1< kmem_cache_alloc str

函数参数传递和动态内存分配的问题

问题描述 函数参数传递和动态内存分配的问题 利用下面这段代码进行动态内存分配有什么问题: char *getmemory(int sum) { char *p=NULL; p=(char *)malloc(sum); return p; } int main() { char *str=NULL; str=getmemory(100); strcpy(str,"hello c!"); printf("%sn",str); } 解决方案 你的主程序需要释放内存,否则可

Linux内核中常见内存分配函数【转】

 转自:http://blog.csdn.net/wzhwho/article/details/4996510 1.      原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示.四级页表分别为: l         页全局目录(Page Global Directory) l         页上级目录(Page Upper Directory) l         页中间

Linux内核中常见内存分配函数(一)

linux内核中采 用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系 统中,用到了四级页表. * 页全局目录(Page Global Directory) * 页上级目录(Page Upper Directory) * 页中间目录(Page Middle Directory) * 页表(Page Table) 页全局目录包含若干页上级目录的地址,页上级目录又依次包含若干页中间目录的地址 ,而页中间目录又包含若干页表的地址,每一个页表项指

MFC教程(10)-- 内存分配方式和调试机制

M内存分配 内存分配函数 MFCWin32或者C语言的内存分配API,有四种内存分配API可供使用. Win32的堆分配函数 每一个进程都可以使用堆分配函数创建一个私有的堆──调用进程地址空间的一个或者多个页面.DLL创建的私有堆必定在调用DLL的进程的地址空间内,只能被调用进程访问. HeapCreate用来创建堆:HeapAlloc用来从堆中分配一定数量的空间,HeapAlloc分配的内存是不能移动的:HeapSize可以确定从堆中分配的空间的大小:HeapFree用来释放从堆中分配的空间:

brk和sbrk及内存分配函数相关

brk和sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的:      每个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只分配并不大的数据段空间,程序中动态分配的空间就是从这一块分配的.如果这块空间不够,malloc函数族(realloc,calloc等)就调用sbrk函数将数据段的下界移动,sbrk函数在内核的管理下将虚拟地址空间映射到内存,供malloc函数使用.(参见linux内核情景分析) #include <unist