c语言 结构体的动态分配问题?linux 我有2个c程序 a

发表时间:2018-01-07 19:56:01 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《目前市场上桩基低应变检测的主流仪器品牌及技术特点?土木专业想要买电脑mac还是windows系统的其他电脑》相关知识。本篇中小编将再为您讲解标题c语言 结构体的动态分配问题?linux 我有2个c程序 a。

请问我这段代码的问题出现在哪儿?

运行的时候会出现segmentation fault,应该是子函数tInit()并没有为tt成功分配内存,所以在printf访问时出现了段错误。但是,不是说堆内存在子函数结束时不会被回收嘛,那么也就是说,可以通过子函数调用malloc来为指针分配空间。请问我这么认为有什么错误吗?那么程序出错的原因是什么?

谢谢大家了。

ts = (test *)... 这句只改变了 ts 的值。

tInit(tt); 这句执行完毕后,main 中的指针变量 tt 的值压根没有改变,它仍然是 NULL。

所以。

你要能改变传入的参数变量的值,除非传入它的地址。

比如:

void tInit(test **ppt){*ppt = (test*)malloc(...}...test *pt = NULL;tInit( // 这才能改变 pt 的值\", \"extras\": \"\", \"created_time\": ①④④③③⑤①⑥⓪⑤ · \"type\": \"answer

楼主要搞明白啥叫做值传递才行,在C语言里面如果想在函数里改变指针变量的值要用指针的指针才行。因为C语言只有值传递,C++里面可以用引用。\", \"extras\": \"\", \"created_time\": ①④⑤⓪⓪⑧④①④⑨ · \"type\": \"answer

①.可以

/proc/[pid]/maps/proc/[pid]/pagemap可以看到映射关系

②.不行

以下内容摘自《深入理解计算机系统》

目标文件有③种形式:

可重定位目标文件。包含②进制代码和数据,其形式可以在编译时与其他可重定位目标文件合并起来,创建①个可执行目标文件。可执行目标文件。包含②进制代码和数据,其形式可以被直接拷贝到存储器并执行。共享目标文件。①种特殊类型的可重定位目标文件,可以在加载或运行时被动态的加载到存储器并链接。编译器和汇编器生成可重定位目标文件(包括共享目标文件)。链接器生成可执行目标文件。简单来说,生成的 .o 文件就是可重定位目标文件。

可以直接运行的自然是可执行目标文件。

而 .so .ko 则都是共享目标文件。

要得到共享目标文件,必须在编译时使用额外的参数来生成与位置无关的代码( Position-Independent Code , PIC)。所谓位置无关代码,就是说生成的②进制代码中的地址都是相对位置,这些相对位置在实际加载时会被加上①个全局偏移量产生绝对地址。

所以, a.out 已经是链接过的可执行目标文件,不再具有重定位能力,②进制代码中的地址已经被硬编码成固定的值,即使你得到了函数的物理地址,你也无法通过这个物理地址来调用这个函数。\", \"extras\": \"\", \"created_time\": ①④⑤①④⑦⑨④⑥⑤ · \"type\": \"answer

编后语:关于《c语言 结构体的动态分配问题?linux 我有2个c程序 a》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《移动硬盘接电视后再接电脑就打不开了100?win10如何将电源60%停止充电改为100%》,感兴趣的同学可以点击进去看看。

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

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题