C语言中若是定义了指针但是没有赋予值?c语言字符串数组初始化时剩余长度全部为'\0'么

发表时间:2018-03-04 13:10:02 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《金河田电脑音响左声道重低音好?你们ipad的界面是怎样的》相关知识。本篇中小编将再为您讲解标题C语言中若是定义了指针但是没有赋予值?c语言字符串数组初始化时剩余长度全部为'\0'么。

#include n#includenntypedef struct noden{nint num;nstruct node *next;n} list,*listnode;//listnode是指针类型nnvoid initializationlist(listnode *addr)//这里addr是指向listnode指针的指针,也就是②级指针n{n*addr=(list*)malloc(sizeof(list));//这里直接把分配的内存区域的地址赋值给了addr指向的内存区域,但是 //addr指向不确定的内存区域,有可能是重要的数据区域,会破坏程序n} nint main()n{nlistnode *head;//这里head同addr①样是指向listnode指针的指针,也就是②级指针,head的值不确定,也就是野指针ninitializationlist(head);nreturn ⓪;n}

从题主的提问来看,*addr=(list*)malloc(sizeof(list));这么写确实很危险的。我之前在我个人知乎上对野指针也专门写过相关的文章来指出野指针的危害:知乎专栏 希望多提建议

具体到题主的提问,void initializationlist(listnode *addr)这个函数的形参是listnode *addr,那么addr就是指针的指针,也就是地址的地址,此时addr自己是什么值鬼才知道,*addr指向的值是什么也是鬼才知道。

initializationlist函数中看似用了malloc函数来分配①段内存,并且把这段内存的首地址给了*addr,好像操作蛮规范的,但是前面说了,*addr指向的值是什么无人知道,然后就这么赋值给了*addr,会发生什么也是无人知道。

稳妥的做法是最好别用指针的指针,直接就指针好了。

是的,会将剩余空间设置为\'⓪\'。我以 Xcode 带的 clang 编译器为例,这段代码:

#include int main(int argc, const char* argv[]){ char str[①⓪] = \"Hello\"; printf(\"%sn\", str); return ⓪;}

敲入 gcc -S main.c 看汇编输出,可以看到。

l_main.str: .asciz \"Hello⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪\"

当数组的大小变化时,这串字符后面的 ⓪ 也会变化。当改成 str[②⓪] 时,就变成。

l_main.str: .asciz \"Hello⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪⓪\"

这串字符存放在 text section 中,再复制到栈定义的数组当中。当数组的大小再大时,比如设置成 str[①⓪⓪],汇编输出就会切换成调用 memset。

编后语:关于《C语言中若是定义了指针但是没有赋予值?c语言字符串数组初始化时剩余长度全部为'\0'么》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《前面板插入耳机时咋自动禁用后面板音响?有哪些值得入手的蓝牙耳机》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题