血的教训
昨天调试遇到两个段错误
0x00007ffff7ade419 in memcpy () from /lib/libc.so.6
0x00007ffff7acd3c9 in _IO_default_xsputn () from /lib/libc.so.6
过去一直对指针初始化没什么概念,经过昨天血淋淋的教训(调试时候,产生各种奇怪的预想不到的错误),终于知道,如果要对字符指针多次赋值,是不能用字符串初始化的。如
char *buf = "\n";
这样初始化过的buf是只读的,要是再次赋值,会报段错误。
我以为不初始化就没问题了,太天真了,
char *buf;
结果虽然不报错,却会覆盖其它数据,例如我定义了一个
int child = 2;
在我给buf赋值后,child竟然变成了23132。一开始没有什么段错误和数据溢出的概念。现在总算长见识了。
正确定义应该是
char buf[20] = "hello"
数组定义了size后,是可以初始化为可改写数据的,但是指针直接被字符串初始化就被看做是只读的了。
或者char *buf = (char*)malloc(20);
sprintf(buf,"hello");