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;
}

 

 这里进行了三种方式字符串赋值

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
=(íý¿Ð,

 

 

以上是个人的理解,有说的不对的地方,还请指正!

 

 

-------------踏着落叶,追寻着我的梦想

 

 

 

 


 

posted on 2010-02-25 13:59  寂寞的肥肉  阅读(1591)  评论(12编辑  收藏  举报

导航