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

时间:2018-01-07 19:56:01   浏览:次   点击:次   作者:   来源:   立即下载

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

运行的时候会出现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

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息