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程序

  • 2015年08月30日 18:58
  • 69KB
  • 下载

c中字符串的操作函数

  • 2014年04月29日 15:43
  • 148KB
  • 下载

c/cpp中如何分割字符串,类似于split的功能

C标准库中strtok的使用相关适宜,有关于strtok的非线程安全特质,以及strtok的替代函数strsep的用法...
  • bg2bkk
  • bg2bkk
  • 2014年07月08日 19:56
  • 7083

字符串替换C程序

  • 2014年07月04日 14:58
  • 2KB
  • 下载

C库函数(字符串转换篇)

  • 2013年08月15日 14:25
  • 181KB
  • 下载

实现一个replace函数替换掉指定c串中子字符串

基本思路,先扫描source字符串, 记录下所有

C例子:DIY字符串连接函数

  • 2015年11月28日 13:59
  • 4KB
  • 下载

C例子:DIY字符串比较函数

  • 2015年11月28日 19:59
  • 3KB
  • 下载

【字符串处理算法】回文判断的算法设计及C代码实现

一、需求描述输入一个字符串,编写程序判断这个字符串是否是回文串。为了便于说明,设定输入的字符串分为中文字符串和非中文字符串两种。其中,中文字符串中仅包含中文字符,非中文字符串中不包含中文字符。所谓回文...
  • zhouzxi
  • zhouzxi
  • 2016年02月22日 17:41
  • 2625

C例子:DIY字符串复制函数

  • 2015年11月26日 22:46
  • 8KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c之字符串分配
举报原因:
原因补充:

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