给指针用字符串直接进行初始化的坑

起因:由于在《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语言有多危险知道了吧!处处是坑!!

 

posted @ 2020-08-20 12:55  阿拉灯神丁0  阅读(321)  评论(0)    收藏  举报