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。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息