c/c++中动态内存分配处理字符串的细节问题

#include <stdio.h>

#include <stdlib.h>
#include <string.h>
#include <malloc.h>
 main()
{
  char *p;
  char *q;
  p=(char*)malloc(25*sizeof(char));
  if(p==NULL) exit(1);
  //q=(char*)malloc(10*sizeof(char));
  //if(q==NULL) exit(1);
  strcpy(p,"dongbeijadlf");
  q="chenyudgf";
  printf("%s\n",q);
  printf("%s\n",p);
  strcat(p,q);
  printf("%s\n",p);
  free(p);
  p=NULL;
  //free(q);
  //q=NULL;
 }

程序很简单,但是我却调试了很长时间才搞懂;

首先要分清常量区和动态区;

q=“chenyujie”,其中chenyujie为常量,将常量的首地址赋给指针,赋给的是常量区首地址,这块内存不允许修改的,对比p的操作,申请动态空间,利用strcpy函数操作,将内容移植到动态区,从而再利用strcat操作,成功。否则失败。

总结就是动态内存的使用是基于堆的操作,是连续的可写的,常量区是不可以改的。

时间: 2024-10-14 07:30:14

c/c++中动态内存分配处理字符串的细节问题的相关文章

C语言中动态内存的分配

动态内存分配:根据需要随时开辟,随时释放的内存分配方式.分配时机和释放时机完全由程序员决定,由于没有数据声明,这部分空间没有名字.无法像使用变量或数组那样通过变量名或数组名引用其中的数据,只能通过指针变量来访问.注意malloc与free一般都是成对出现的只要成功申请的空间使用完后必须要释放,否则会造成内存的泄露. 1 #include<stdio.h> 2 #include<stdlib.h> 3 int sum(int *,int);///函数的声明 4 int mian()

C++解析(25):关于动态内存分配、虚函数和继承中强制类型转换的疑问

0.目录 1.动态内存分配 1.1 new和malloc的区别 1.2 delete和free的区别 2.虚函数 2.1 构造函数与析构函数是否可以成为虚函数? 2.2 构造函数与析构函数是否可以发生多态? 3.继承中的强制类型转换 4.小结 1.动态内存分配 1.1 new和malloc的区别 new关键字与malloc函数的区别: new关键字是C++的一部分 malloc是由C库提供的函数 new以具体类型为单位进行内存分配 malloc以字节为单位进行内存分配 new在申请内存空间时可进

SQLite剖析之动态内存分配

SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.以及保存查询结果.我们做了很多努力来让SQLite的动态内存分配子系统可靠.可预测.健壮并且高效.本文概述SQLite的动态内存分配,软件开发人员在使用SQLite时可以据此获得最佳性能. 1.特性    SQLite内核和它的内存分配子系统提供以下特性:    (1)对内存分配失败的健壮处理.如果一个内存分配请求失败(即malloc()或realloc()返回NULL),SQ

C++ 动态内存分配(6种情况,好几个例子)

1.堆内存分配 : C/C++定义了4个内存区间: 代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念: 通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间.这种内存分配称为静态存储分配: 有些操作对象只在程序运行时才能确定,这样编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分

Lesson(DynamicMerry)动态内存分配

//  main.m //  1-27随堂笔记 //讲师: 小辉 //笔者: 王学文 //  Created by lanouhn on 15/1/27. //  Copyright (c) 2015年 lanouhn. All rights reserved. //动态内存分配(DynamicMerry) #import <Foundation/Foundation.h> void test() { int x = 10; int y = 20; } //函数返回栈区的数据,是不安全的;一i

动态内存分配PK栈区分配(性能还是灵活性)

       为什么要申请动态内存分配使用权的问题:我想自己以前是根本没有任何的经验的.我的程序中几乎没有在堆中申请动态内存,全部都是在栈区中建立数组,但是数组的长度是有限的,根据测试表明,数组的存储的容量大概是400KB,所以在实现加解密程序的时候,仅仅是为了达到要求,并没有使用动态分配的技术.假设一个整型变量存储一个汉字的话,能够存储的字符个数大概是10万个汉字,那么动态分配的存储个数更是庞大.我的程序应该尝试使用并且懂得如何释放. int* number=new int [10000000

C10_动态内存分配

// //  main.m //  C10_动态内存分配 // //  Created by dllo on 15/7/13. //  Copyright (c) 2015年 zhozhicheng. All rights reserved. // #import <Foundation/Foundation.h> void func(){ int x=5; int y=6; printf("x=%p\n",&x); printf("y=%p\n"

iOS开发中的内存分配与分区

iOS开发中的内存分配与分区 关于RAM&ROM RAM与ROM就是具体的存储空间,统称为存储器. RAM(random access memory):运行内存,CPU可以直接访问,读写速度非常快,但是不能掉电存储.它又分为: 动态DRAM,速度慢一点,需要定期的刷新(充电),我们常说的内存条就是指它,价格会稍低一点,手机中的运行内存也是指它. 静态SRAM,速度快,我们常说的一级缓存,二级缓存就是指它,当然价格高一点. ROM(read only memory):存储性内存,可以掉电存储,例如

简述动态内存分配

动态内存分配 本讲内容 存储区划分 堆内存分配函数 其他内存分配函数 内存操作函数 1.内存区划 栈区      int a =3 堆区     malloc(255) 静态存储区     static  float h =1.36f 常量区    "lanou"  代码区       int getCount(){...} 自定义函数位于栈顶 main函数位于栈底 main函数既是程序的入口,也是程序的出口. stack(栈) FILO(先进后出)(相当于水杯单向) queue(队列