C语言——这两种情况下该如何进行指针操作?

我在main函数中定义了变量

unsigned int *lp = NULL;

然后调用了函数A,函数A的定义如下

int A(const char *cp, unsigned int *lp)
{
    /**cp是传进来的字符串*/
    char cps[] = cp;

    /*对*lp做位操作*/
    *lp << 8;
}

编译时Asan检查两处报错如下:
image.png

image.png
我有这些问题:
1.使用数组接收字符串为什么会报非法初始化?
2.第二处位操作的部分,我是想要在这里改变这个指针变量所指向的值,这个写法应该是不对的,但为什么会报内存错误呢?
3.位操作这一步,想实现改变指针变量指向值都可以有哪些写法呢?

——————————————————————————————————————————————————————————————————————————————————

2、3处纠错:
问题出在我调用的时候,我在主函数里进行了下面的调用

char* test[] = {"192.168.10.1", "255.255.255.255"};
unsigned int* lp = 0;
A(test[i], lp);

这样调用的话,lp调用为传值调用,初始化的时候lp初始化为了NULL,编译运行可以观察到lp为0,即指向了NULL指针,将lp作为参数调用,传进函数里则为传递了NULL指针。
调用时将lp改为&lp该处错误就解决了

——————————————————————————————————————————————————————————————————————————

阅读 2.2k
3 个回答
  1. char[] = "xxxx"; 是可以的,char[] = cp; 不可以。
  2. *lp 要读取 lp 内所保存的地址的值,而 lp 保存的地址是 NULL ,不可读。
  3. *lp = *lp << 8;, *lp <<= 8;

遇到问题至少先把类型错误先解决吧.

  1. 类型问题
    cp是char **cp不就成char了吗,char能赋值给char[]吗?
  2. 声明信息确实
    一个声明总是要指明他的内存布局和占用内存的大小为啥你的char cps[] = *cp;不能成功,因为这条声明已经描述了内存布局就是每一个byte都存着一个char但是他的大小信息是不明确的,所以你应该再补上这些信息,比如char cps[] = {*cp};这样编译器就知道你学要声明一个长度为1的数组。
  3. 为啥*lp << 8会报错;
    你给lp初始化为0了当然一解引用就会报错因为虚拟内存的低地址部分都被操作系统映射为一段程序无法使用的区间,你一访问就会报错,要想程序能正常运行你应该这样

    int a = 0;
    int *lp = &a;

    想这样lp指向的地址就是合法的了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题