c之字符串分配

原创 2015年07月08日 11:47:45

今天还在做着小作业,终于把框架大体搭好,准备脱离stl用c语言来解析字符串。却碰到了诸多问题。
原来堆栈基本不太懂,现在稍稍知道了,还有字符串指针和数组的区别。哎
简单的写了几个定义和初始化字符串的方式
 char *szName1 = "  dir \ad\ what are you doing"; //  q全局const区域
 char szName2[] = "  dir \ad\ what are you doing";//栈 区
 char *szName3 = new char[64];                   //堆区
 szName3 = "  dir \ad\what are you doing";
 char *szName4 = szName2;                      //栈区的指针指向栈区的内存
debug一看,原来果真只有 szName[2]是char[]型
debug信息:

-  szName1 0x0041564c "  dir dWhat are you doing" char *
   32 ' ' char
-  szName3 0x0041564c "  dir dWhat are you doing" char *
   32 ' ' char
-  szName4 0x0012ff38 "  dir dWhat are you doing" char *
   32 ' ' char
-  szName2 0x0012ff38 "  dir dWhat are you doing" char [27]
  [0] 32 ' ' char
  [1] 32 ' ' char
  [2] 100 'd' char
    ......
我理解是:
  指针保存的仅仅是这个串的首地址,而串数组保存了整个串的信息,数组名可以用来访问首地址,但并不是一个指针!

我写了一个函数是要传递指针的指针,当我把szName1, szName3, szName4取地址传过去可以,但是传递&szName2就不行了,提示错误是不能实现数组的指针向指针的指针 转换。
我曾经试图传递指针的引用来实现修改字符串指针的功能,szName1, szName3, szName4也可以实现引用的传递,而szName2 还是不行。其实我想得到一个官方的解释,暂时就先这样理解了。



char amessage[] = "now is the time"; /* an array */
实际上等同于
char amessage[16] ;
strcpy(amessage, "now is the time" ;
16是字符串"now is the time"的长度加1.
可以看出内存空间是分配在栈上的.

char *pmessage = "now is the time"; /* a pointer */
而pmessage指向的内容始终是常量,不可能被改变的.
而p = strdup(a)实际上等同于
p = (char*)malloc(strlen(a) + 1) ;
strcpy(p, a) ;
可以看出来,strdup返回的指针指向的是在堆上新分配的内存.
要修改也是修改新分配的内存空间中的内容.不是原来a指向的内容.



程序代码:

#include "stdio.h"
#include  "string.h"

const int MAX_LENGTH = 256;


void StrReStrEx(char **pnewstr, char c)
{
 size_t i = 0;
 for (; i<strlen(*pnewstr); i++)
 {
  if ((*pnewstr)[i] != c)
  {
   break;
  }
 }
 *pnewstr = *pnewstr+i;
}

void StrReStrEx1(char *&newstr, char c)
{
 size_t i = 0;
 for (; i<strlen(newstr); i++)
 {
  if ((newstr)[i] != c)
  {
   break;
  }
 }
 newstr = newstr+i;
}

int main()
{
 char *szName = "  dir \ad\What are you doing"; //  q全局const区域
 char szName2[] = "  dir \ad\What are you doing";//栈 区
 char *szName3 = new char[MAX_LENGTH];            //堆区
 szName3 = "  dir \ad\What are you doing";
 char *szName4 = szName2;                   //栈区的指针指向栈区的内存
 printf("%s\nszName:%d\n",szName, strlen(szName));

 char *temp = szName;
 StrReStrEx1(szName, ' ');
 printf("%s\nszName1:%d\n",szName, strlen(szName));

 StrReStrEx1(szName3, ' ');
 printf("%s\nszName3:%d\n",szName3, strlen(szName3));

 StrReStrEx1(szName4, ' ');
 printf("%s\nszName4:%d\n",szName4, strlen(szName4));

//  StrReStrEx1(szName2, ' ');
//  printf("%s\nszName:%d\n",szName2, strlen(szName2));
 return 0;
}

字符串的基本操作--基于堆分配存储

字符串一般简称为串。 堆分配存储结构的串有顺序存储结构的特点,处理方便,操作中对串长又没有任何限制,更显灵活,因此选择堆分配存储串。 利用c语言实现字符串的基本操作(查找,替换,连接等): c语...
  • zhoufen12345
  • zhoufen12345
  • 2017年03月26日 18:29
  • 677

输入一个长度未知的字符串,用动态分配内存的方法(C语言实现)

int main(int argc, char** argv) { int strLen = 5; char ch; char* str = (char*)malloc(sizeof(char*) *...
  • ymwvs
  • ymwvs
  • 2014年04月13日 15:24
  • 3682

C语言 堆形式存储的字符串操作

/** 以堆分配存储表示串,串基本操作 作者:nuaazdh 时间:2012年5月28日 */ #include #define OK 1 #define ...
  • nuaazdh
  • nuaazdh
  • 2012年05月28日 21:17
  • 2517

C语言的字符指针必须分配空间或者指向某个地址否则不能使用

yzr8963818 | 分类:C/C++ | 浏览1134次 C语言的: char *p=null; char *str="abc"; for(int i=0;i...
  • joakimzhang
  • joakimzhang
  • 2014年01月14日 17:10
  • 397

C语言中变量的地址分配

CPU的内部架构和工作原理                       为什么寄存器比内存快     存储器顺序:寄存器→Cache→内存→外存 1、在C语言中,定义一个变量时,地址是如何分配的?...
  • pengpengjy
  • pengpengjy
  • 2017年02月28日 10:30
  • 806

C语言程序的内在分配:堆和栈以及char a[]和char*的区别

http://blog.csdn.net/pipisorry/article/details/29441381char[]和char *的区别《c语言程序设计》的解释char ame[] = "nw ...
  • pipisorry
  • pipisorry
  • 2014年06月08日 23:48
  • 1831

C语言内存分配及堆栈问题总结

1. C语言程序编译的内存分配,堆与栈的区别  C语言程序编译的内存分配: 1.栈区(stack) --编译器自动分配释放,主要存放函数的参数值,局部变量值等; 2.堆区(he...
  • L_chxu
  • L_chxu
  • 2013年04月23日 20:41
  • 7111

Thinking in SQL系列之三:供需分配问题

供需分配,简单来说就是你有各种需求,我来个性化供应满足。很多问题都可以转化为此类问题,应用很普遍。 可以采用类似ALU的改进,将ROW BY ROW的处理方式转换为并行处理。通过提前窥探,无需等待前一...
  • NcFire
  • NcFire
  • 2017年02月11日 02:30
  • 509

NOI题解(1.7编程基础之字符串)(待补全)

01:统计数字字符个数 #include "iostream" #include "iomanip" using namespace std; int main() { string str;...
  • v_xchen_v
  • v_xchen_v
  • 2016年09月07日 19:37
  • 1626

字符串(堆分配存储)11种操作的实现

操作 时间复杂度(T(n)) 空间复杂度(S(n)) 判断是否为空 O(1) O(1) 得到长度 O(1) ...
  • gaoxiangnumber1
  • gaoxiangnumber1
  • 2015年04月08日 00:34
  • 485
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c之字符串分配
举报原因:
原因补充:

(最多只允许输入30个字)