最新消息:20190717 VPS服务器:Vultr新加坡,WordPress主题:大前端D8,统一介绍入口:关于

字符指针 不等于 字符数组

工作和技术 crifan 654浏览 0评论

最近编程遇到一些关于指针的低级错误:

只是申请了一个字符类型指针,就以为可以用来存储其他函数返回来字符串,实际情况是:

指针是申请了,但是只是有存储指针的空间,而实际指针地址指向的地方,我们是不知道的,它是个随机的,每次运行都会不一样,好像这也就是所谓的野指针了。也就是这个野指针指向地址的内容是没有任何保障的,而且很可能是自己没有权限访问,或者是那个地方是被别的程序所使用的。自己这样乱用的话,就会导致将原来存在的,很有可能是其他程序的有效数据覆盖掉了,那么肯定最后容易出错。

关于此处的申请的指针,具体举例:

申请一个字符类型的指针,系统给了个地址0x1234,存储你这个字符指针,记住,不论是什么类型的指针,根本上都是指针,一般也就是占用4个字节。而你这个指针的值,由于开始没有初始化,是个野地址,假如值是0x6789,此时调用一个函数,将这个指针传这个函数,然后去进行一系列处理后,原意是在那个函数中将一个字符串拷贝到这个指针位置的,代码实现,也就是将函数中的字串的首地址赋值给这个字符指针,看似得到我们想要的了,但是实际情况是,函数内的字符串,在函数调用结束后,就消失了,另一些函数中,是用字符拷贝到我们这个字符指针的对应位置的,但是实际产生的效果却是,将用于存储字符指针的地址传给了函数,然后往其后一段空间拷贝字符,这极有可能修改了其他的有效数据,即使没有发生这个情况,那么返回时候,也极有可能你这个字符指针其后的空间,是被其他当前函数的变量占据着,也就将上述的返回的字串冲掉了,总之这种是极度危险的做法,错误的做法。

正确的做法应该是,在申请的时候,申请一个字符数组,然后将数组首地址,也就是字符数组名传给那个函数,然后经过其处理之后,将对应字符拷贝到你这个字符数组中,这样才能实现字符串的真正返回。

(疑问:为何编译器不给自己初始化呢?我估计是如果每个都让编译器初始化,那么工作量很大,最主要应该还是这些工作,应该由编程人员自己懂得自己要做什么,要自己去初始化)

相关内容,等偶更清楚了,然后待续。。。

转载请注明:在路上 » 字符指针 不等于 字符数组

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
53 queries in 0.084 seconds, using 18.83MB memory