首先了解一下字符文本和常量
定义字符串时编译器自动在字符串结尾增加转义字符·0。某些文献中字符串常量也叫作字符串文本。
最有趣的事是从RO扇区分配内存给字符串常量。RO扇区是存储字符串文本和常量的只读数据区。
存储在该区域的数据的生命周期为程序运行的整个生命周期,这也是存储在该区域的数据变量的生命期。
#include<stdio.h>
char * fool(void);
int main()
{
char *m=fool();
printf("%s\n",m);
}
char *fool(void)
{ char * str="STRING";
return str;
}
虽然变量的charsr为函数foo0的局部变量,但它在所有范围内均能被访问。
如前所述,变量charstr是一个字符串文本或常量,它的内存是从RO扇区分配的,所以在程序运行的整个生命周期中都有效。
自然常量化为字符串文本的另一个重要特性。**一旦字符串文本被初始化其值,就不能在后面的阶段修改字符串文本,**相当于 const char*变量名,其中指针可被修改,但所指的值不能修改。
下面就写下通过指针实现字符串复制与连接
字符串复制
void str_cpy(char *dest_str,const char *src_str)
{
char *stemp=src_str;
char *dtemp=dest_str; while(*stemp!='\0')
{ *dtemp=*stemp;
dtemp++;
stemp++;
}
*dtemp='\0';//字符串末尾记得放结束标识符
}
上面的代码遍历源字符串直到结束符‘0为止。遍历时将每个字符复制到目标字符串,而且同时累加指向源字符串和目标字符串的指针。用一个整数变量来计算该字符串存储的字符数。最后将结束符0复制到目标字符串。
void str_cat(char *dest_str,const char *src_str)
{
char *stemp=src_str;
char *dtemp=dest_str;
while(*dtemp!='\0')
{
dtemp++;//到达字符末尾
}
while(*stemp!='\0')
{
*dtemp=*stemp;
dtemp++;
stemp++;
}
*dtemp='\0';//字符串末尾记得放结束标识符
}
二级声明
(当数组大小与每个数组元素的数据容量都未知时使用)
声明:
char ** 变量名
下面我们用代码来演示
借助二级字符指针,首先创建指针存储空间,接着从堆中分配空间来存储字符串的指针。
第二次遍历时重新分配内存存储指针,接下来再从堆中分配空间来存储新字符串的指针。
#include<stdio.h>
#include<malloc>
#include<cstring>
int main()
{
char **arr=NULL;
char string[30];
int i;
for(int i=0;i<6;i++)
{
printf("Insert data\n");
scanf("%s",string);
if(arr=NULL)
{
arr=(char **)malloc(sizeof(char *));
}
else
{
arr=(char **)realloc(arr,sizeof(char *)*i+1);
}
arr[i]=(char *)malloc(sizeof(char *)*(strlen(string)+1));
strcpy(arr[i],string);
}
for(int i=0;i<6;i++)
printf("%d %s\n",i,arr[i]);
freestrmemory(arr,5);
}
void freestrmemory(char **arr,int len)
{
int i;
for(int i=0;i<=len;i++)
{
free(arr[i]);
}
free(arr);
}
在上述情况下释放内存稍有点棘手。下面
为释放内存所需要遵循的基本步骤。
1.遍历数组每一行。
a.访问每行时,释放存储字符串的相应内存。
2.一旦完成数组遍历,释放存储所有指向字符串指针的分配内存。

被折叠的 条评论
为什么被折叠?



