给指针用字符串直接进行初始化的坑
起因:由于在《C与指针》153页看到这么一个定义
char *message2 = "Hello";
这种定义早就想尝试了,在看到书上这么写后,就进行了如下代码
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int main() { char *p = NULL; char *s = "ing"; p = "string1"; strtok(p, s); puts(p); // printf("%d\n", sizeof(p)); // printf("%d\n", strlen(p)); // printf("%p\n", (void *)p); // printf("%#X\n", (int )p); cout << (void *)p << endl; return 0; }
编译过程中没有任何问题,但就 p的赋值来说
结果如下:

直接段错误,就很懵逼,因为在此之前对该定义也是非常迷惑的。
找到12前的这篇文章 char *p="1234567890",这样的定义有问题吗?
说这种操作不会引起编译器的注意,而且就算用字符串初始化 p以后再给 *p 赋值都不会出错,但是在最后执行的时候还是会报段错误;
文中指出以后写该类的初始化不能直接定义
char * p = "string"; // 错误
应该
const char *p = "string" // 正确
同时这里还包含了另外一个意思,这不影响指针p再指向别的字符值常量!!!
这里的错误和正确不是指语法上的,更多的是看该行代码的人一种提示,说这里的 p指向的区域不能进行更改。
同时文中还指出将一个整型值也可以强制转换为指针的,虽然也不报错,但是执行的时候程序会崩溃。
int a;
a = 10;
*(int *)a = 10; //危
现在C语言有多危险知道了吧!处处是坑!!!

浙公网安备 33010602011771号