C语言字符串初探
C语言是没有字符串类型的,一般通过字符指针或者字符数组进行操作。指针和数组的差别这里就不讲了。
首先说明下程序中变量在内存中的分布。
全局变量存储在数据段中,局部变量存储在堆栈中,利用malloc动态分配的变量存储在堆中。堆栈和堆的区别请google.
下面根据一个具体的程序来看。
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *s1,*s2,*s3;
void test()
{
char *p1 = "abc";
char *p2, p3[10];
p2 = malloc(10);
strcpy(p2, "abc");
strcpy(p3, "abc");
printf("static address:%p\n", &("abc"));
printf("p1 address:%p\n", p1);
printf("p2 address:%p\n", p2);
printf("p3 address:%p\n", p3);
s1 = p1;
s2 = p2;
s3 = p3;
}
int main(void)
{
test();
printf("s1=%s\n", s1);
printf("s2=%s\n", s2);
printf("s3=%s\n", s3);
return 0;
}
#include <stdlib.h>
#include <string.h>
char *s1,*s2,*s3;
void test()
{
char *p1 = "abc";
char *p2, p3[10];
p2 = malloc(10);
strcpy(p2, "abc");
strcpy(p3, "abc");
printf("static address:%p\n", &("abc"));
printf("p1 address:%p\n", p1);
printf("p2 address:%p\n", p2);
printf("p3 address:%p\n", p3);
s1 = p1;
s2 = p2;
s3 = p3;
}
int main(void)
{
test();
printf("s1=%s\n", s1);
printf("s2=%s\n", s2);
printf("s3=%s\n", s3);
return 0;
}
这里进行了三种方式字符串赋值
1.
char *p1 = "abc";
这里怕p1指向了一个常量字符串"abc",这个存储在数据段中,可以供全局使用。
2.
char *p2;
p2 = malloc(10);
strcpy(p2, "abc");
p2是通过malloc进行的动态内存分配而来的,存储在堆中,可供全局使用,一般使用完要free掉,否则会导致内存泄漏。
3.
char p3[10];
strcpy(p3, "abc");
p3是数组名,这种方式生成的变量存储在堆栈中,作用域是局部的。
在test函数被调用完成后,p3所定义的字符串由于存储在堆栈中,会被释放掉,p1,p2所指向的字符串非别存储在数据段和堆中,不会被释放掉。
这也是为什么printf("s3=%s\n", s3);不打印"abc"的原因。
最后给出程序的执行结果:
static address:0x80485cc
p1 address:0x80485cc
p2 address:0x9ffc008
p3 address:0xbffded10
s1=abc
s2=abc
s3=(íý¿Ð,
p1 address:0x80485cc
p2 address:0x9ffc008
p3 address:0xbffded10
s1=abc
s2=abc
s3=(íý¿Ð,
以上是个人的理解,有说的不对的地方,还请指正!
-------------踏着落叶,追寻着我的梦想