malloc calloc realloc

三个函数的申明分别是: 
void* realloc(void* ptr, unsigned newsize); 
void* malloc(unsigned size); 
void* calloc(size_t numElements, size_t sizeOfElement); 
都在stdlib.h函数库内

 

    (1)函数malloc()
        在内存的动态存储区中分配一块长度为size字节的连续区域,参数size为需要内存空间的长度,返回该区域的首地址.

    需要手动清0

    (2)函数calloc()
        与malloc相似,参数sizeOfElement为申请地址的单位元素长度,numElements为元素个数,即在内存中申请numElements*sizeOfElement字节大小的连续地址空间.  同时初始化了这块内存
    (3)函数realloc()
        给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度.

    需要手动清0

char* p; 
p=(char*)malloc(20);
memset(p,0,20); //如果申请成功,要做初始化处理
char* p; p=(char*)calloc(20,sizeof(char)); char* p; p=(char*)malloc(sizeof(char)*20); p=(char*)realloc(p,sizeof(char)*40);
memset(p,0,40);//如果申请成功,要做初始化处理
free(p); //释放后,要把指针指向null
p = NULL;

 

strcat 合并栈空间的局限性。栈空间不可伸缩,合并越界,没有办法解决

myStrcat 合并堆内存,堆内存可以伸缩,解决了合并越界的问题。

#include <stdio.h>
#include <string.h>

#define SIZE 5
char* myStrcat(char **dest, char *src)
{
int destLen = strlen(*dest);
char *tmp = *dest; //申请失败返回
int srcLen = strlen(src);
//    *dest = (char*)realloc(*dest, destLen + srcLen + 10000000000000000000);
*dest = (char*)realloc(*dest, destLen + srcLen);
if (*dest == NULL){
  return tmp;
}
for (int i = 0; i < srcLen + 1; i++)
{
  (*dest)[destLen + i] = src[i];
}
return *dest;
}

int main(int argc, char* argv[])
{
char a[SIZE] = "abcd";

char * p = (char*)malloc(SIZE);
memset(p, 0, 5);
strcpy(p, a);

cout << myStrcat(&p, "3367") << endl;;
}


 

 

原文链接: https://www.cnblogs.com/yuguangyuan/p/5848221.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    malloc calloc realloc

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/398202

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月11日 上午9:56
下一篇 2023年4月11日 上午9:56

相关推荐