while循环数组 里面 字符串数组 怎么会内存一直会上升

博客分类:
在C中定义字符串有下列几种形式:字符串常量,char数组,char指针
1.字符串常量
即:位于一对双括号中的任何字符。双引号里的字符加上编译器自动提供的结束标志\0字符,作为
一个字符串存储在内存中。如:printf("%s","hello"); //"hello"
如果字符串文字中间没有间隔或间隔的是空格符,ANSI
C 会将其串联起来。例:
char greeting[50] = "hello,and" "how are" "you";
char greeting[50] = "hello,and how are you";
字符串常量属于静态存储类。静态存储是指如果在一个函数中使用字符串常量,即使是多次调用了这个函数,
该字符串在程序的整个运行过程中只存储一份。整个引号的内容作为指向该字符串存储位置的指针。这一点与
把数组名作为指向数组存储位置的指针类似。
2.字符串数组及其初始化
初始化例子:
char m[40] = "hello,world";
//定义字符串数组时必须指定数组大小(整型常量),在指定大小时,要确保数组的大小比预定的大一个,因为编译器会自动添加'\0'。
//多余的元素会初始化为'\0'
char m={'h','e','l','\0'};
//注意标志结束的空字符,若没有它,得到的只是一个字符数组而不是字符串
3.利用char指针定义字符串
char *m = "hello,world"; //自动添加'\0'
注意:此时字符串指针m指向字符串常量,不成用*(m+1)='o'修改此常量,因为这个字符串常量放在常量区不能被修改
4.数组和指针
数组形式和指针形式有什么不同呢?
数组形式: char m[40] = "hello,world";
指针形式: char *m = "hello,world";
数组形式:
编译器会把数组名m看作是数组首元素的地址&m[0]的同义词,m是个地址常量。可以用m+1来标识数组里的下一个元素,但不能使用++m,增量运算符只能在变量前使用, 而不能在常量前使用。
m[40]在计算机内存中被分配一个有40个元素的数组(其中每个元素对应一个字符,还有一个附加的元素对应结束的空字符'\0')。每个元素都被初始化为相应的字符。
通常,被引用的字符串存储在可执行文件的数据段部分;当程序被加载到内存中时,字符串也被加载到内存中,把被引用的字符串复制到数组中
指针形式:
指针形式(*m)也会在静态存储区为字符串预留空间。此外,一旦程序开始执行,还要为指针变量m另外预留一个存储位置,以在该指针变量中能够存储字符串的地址。
m指向字符串的第一个字符,可用++m指向第二个字符。
指针m是个变量。
浏览 27767
浏览: 163369 次新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
丰衣足食, 积分 951, 距离下一级还需 49 积分
论坛徽章:1
int ttid(char * info,int e,char *reun)
{
& & & & char *tmp_info[strlen(info)+2];
& & & & memset(tmp_info,0,strlen(info)+2);
& & & & char tmpdata[strlen(info)+1];
& & & & memset(tmpdata,0,strlen(info)+1);
& & & & strcpy(tmpdata,info);
& & & & char *tmp[strlen(info)];
& & & & memset(tmp,0,strlen(info));
& & & & char *dest=(char*)&
& & & & int i=0;
& & & & char *outer_ptr=NULL;
& & & & if(e==0)
& & & & {
& & & & & & & & while((tmp[i]=strtok_r(dest,&_&,&outer_ptr))!=NULL)
& & & & & & & & {
& & & & & & & & & & & & i++;
& & & & & & & & & & & & dest=NULL;
& & & & & & & & }
& & & & & & & & tmp_info[0]=(char*)&tmp[0];
& & & & & & & & tmp_info[1]=(char*)&tmp[1];
& & & & & & & & tmp_info[2]=&0&;
& & & & & & & & strcpy(reun,(char*)&tmp_info);
& & & & & & & & if(i==2)
& & & & & & & & {
& & & & & & & & & & & & return 2;
& & & & & & & & }else{
& & & & & & & & & & & & return 1;
& & & & & & & & }
& & & & }else{
& & & & & & & & while((tmp[i]=strtok_r(dest,&@&,&outer_ptr))!=NULL)
& & & & & & & & {
& & & & & & & & & & & & i++;
& & & & & & & & & & & & dest=NULL;
& & & & & & & & }
& & & & & & & & if(i==2)
& & & & & & & & {
& & & & & & & & & & & & i=0;
& & & & & & & & & & & & char *tmp1[strlen(info)];
& & & & & & & & & & & & memset(tmp1,0,strlen(info));
& & & & & & & & & & & & char *outer_ptr1=NULL;
& & & & & & & & & & & & char *dest1=tmp[0];
& & & & & & & & & & & & while((tmp1[i]=strtok_r(dest1,&_&,&outer_ptr1))!=NULL)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & i++;
& & & & & & & & & & & & & & & & dest1=NULL;
& & & & & & & & & & & & }
& & & & & & & & & & & & if(i==2)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & tmp_info[0]=(char*)&tmp1[0];
& & & & & & & & & & & & & & & & tmp_info[1]=(char*)&tmp1[1];
& & & & & & & & & & & & & & & & tmp_info[2]=(char*)&tmp[1];
& & & & & & & & & & & & & & & & strcpy(reun,(char*)&tmp_info);
& & & & & & & & & & & & & & & & return 2;
& & & & & & & & & & & & }else{
& & & & & & & & & & & & & & & & tmp_info[0]=(char*)&tmp1[0];
& & & & & & & & & & & & & & & & tmp_info[1]=&0&;
& & & & & & & & & & & & & & & & tmp_info[2]=(char*)&tmp[1];
& & & & & & & & & & & & & & & & strcpy(reun,(char*)&tmp_info);
& & & & & & & & & & & & & & & & return 1;
& & & & & & & & & & & & }
& & & & & & & & }else{
& & & & & & & & & & & & tmp_info[0]=&0&;
& & & & & & & & & & & & tmp_info[1]=&0&;
& & & & & & & & & & & & tmp_info[2]=&0&;
& & & & & & & & & & & & strcpy(reun,(char*)&tmp_info);
& & & & & & & & & & & & return 1;
& & & & & & & & }
& & & & }
}
char * ss=&aa_test@abc&;
char tmpdata[strlen(ss)+2];
memset(tmpdata,0,strlen(ss)+2);
ttid(ss,1,tmpdata);
printf(&%s==%s==%s\n&,(char*)&tmpdata[0],(char*)&tmpdata[1],(char*)&tmpdata[2]);
复制代码问一下,为什么这样子数据返回不上来呢?都是乱码,我拷贝上来的?不会函数消失就没了吧,莫非得人工分配内存?有没有不用分配的办法??
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
腰缠万贯, 积分 9987, 距离下一级还需 13 积分
论坛徽章:232
接口上字符串指针,内部返回的是要字符串指针数组,两重指针呢
丰衣足食, 积分 951, 距离下一级还需 49 积分
论坛徽章:1
不是很清楚这里的指针,要怎么处理?
小富即安, 积分 4246, 距离下一级还需 754 积分
论坛徽章:0
指针的指针...
丰衣足食, 积分 951, 距离下一级还需 49 积分
论坛徽章:1
strcpy(reun,(char**)tmp_info);
要这样子吗?可是报错呢?
白手起家, 积分 108, 距离下一级还需 92 积分
论坛徽章:0
你是要在ttid(ss,1,tmpdata);函数里面修改tmpdata数组里面的数据么?
如果是这个目的,那么没错,看看你的函数的逻辑
ps,为毛为啥char数组你都是申请strlen +2 个数据?
丰衣足食, 积分 951, 距离下一级还需 49 积分
论坛徽章:1
给大点,免得越界
现在数据正常了
================74===test===0& && & 这里是内部copy前答应出来的
info=74==4==&&这个是外部取出打印的 不一致?
printf(&info=%s==%s==%s\n&,(char*)&tmpdata[0],(char*)&tmpdata[1],(char*)&tmpdata[2]);
怎么会这样子呢?C中字符串和字符数组区别
字符数组和字符串的细微区别确实不可忽视
比如s[]="aBc";数组s和字符串"aBc"有什么不同吗?
为什么下面的函数传参时,用数组s就可以,用字符串"aBc"就程序错误?(我用的dev-c)
void_strtolower(char*str)//转小写
while(str!='\0')
if(str&='A'&&str&='Z')str=32;
str='\0';
答:数组实际上你指定的"aBc"有两份,一份在常量区,那是不可以修改的,
但是数组会拷贝一份字符串到栈上,这份副本是可以修改的
你直接传入字符串,实际上传入的是常量,不许修改,所以报error
而传入数组,刚才说是可以修改的。
如果你直接写成_strtolower("ABC");就不可以,
用char *str="ABC";_strtolower(str)还是可以的。
从内存分配方面讲这条语句的话str存储的是地址,位置位于栈中,而字符串“aBc"是串常量,位于全局/静态存储区
这部分存储区是在程序编译时分配的,在整个程序运行过程中始终存在,并且这部分字符串常量存储的区域是不可修改的内存区域,也就是说str不应该出现在第二个等于号的左边,所以像str[1]='h';等的语句试图修改不可修改的内存区,导致程序退出。
字符串是整体构成一个常量,即“aBc”是个整体常量,不可分割,可以理解成inti中的“i”。
字符数组可以看成n个变量,即‘a’‘B’‘c’,这三个变量可以分开编辑。
所以你用字符数组程序可以通过,而使用字符串却不行。
直接传“ABC”,是不行的,原因是由于它是const类型的,不能被修改
aBc"是常量,不能被修改
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
A)字符型数组中可以存放字符串 PDF
下载积分:500
内容提示:A)字符型数组中可以存放字符串 PDF
文档格式:PDF|
浏览次数:116|
上传日期: 17:10:51|
文档星级:
全文阅读已结束,如果下载本文需要使用
 500 积分
下载此文档
该用户还上传了这些文档
A)字符型数组中可以存放字符串 PDF
官方公共微信}

我要回帖

更多关于 while循环遍历数组 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信