原则:给没分配使用权的地址空间赋值或修改值毕出现段错误。
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