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