指针

原则:给没分配使用权的地址空间赋值或修改值毕出现段错误。

 

1.函数中直接使用字符串,如 char *str; str = "adsf". "adsf"返回的的地址应该在栈空间里。 随函数消失,此空间的使用权消失。

如:

typdef struct _stu

{

    char *a;

}stu;

void fuc(stu *stu)

{

   stu->a = "shit";

}

int main()

{

    stu stu_test;  //这里已经为结构体分配了可用空间,其指向的指针可一赋值,如果只是初始化结构题指针,此指针指向的->a则不能赋值,因为没有分配空间,编译无错,运行段错误。

     fuc(stu_test);

     printf("%s/n", stu_test->a);

}

这样是可以初始化stu_test->a的值,也能运行。 输出暂时无错。 但“shit”给的是个栈空间的地址。fuc()退出时,此空间使用权就没有了。 此时要在此地址空间赋值如 *(stu->a) = 'a'; 编译无错,运行段错误。而且此空间可能会被程序继续运行而分配给别人,导致内容被修改。  这时stu_test->a 输出的值就不准了。。

正确做法:

void fuc(stu *stu)

{

   stu->a = strdup("shit");

}

strdup函数是malloc了 “shit”大小的堆空间地址。  不释放, 都可以随便用!

 

2. char **str 没分配空间。  *str 不可赋值。 根据实测,此时*str是个类似$2 = 0xff18bb8d <Address 0xff18bb8d out of bounds>  的超过范围的地址。

void fuc1(char **str)

{

    *str = "fuck";

}

int main()

{

     char **str;

     fuc1(str);

    printf("%s/n", *str)

}

编译无错,运行段错误。

 

3.static *a  ;或static **a, a的地址都是0x0  。  如果是static **a,  想给*a赋值, 段错误。因为不能给0x0地址赋值。

 

 

 

C++中的内存分布

http://blog.youkuaiyun.com/tnfyj/archive/2008/09/30/2999325.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值