[英]Segmentation Fault using C macros
使用稍微修改过的MobileC构建时,我有一个奇怪的问题。
我在宏中遇到分段错误,但是当我将printfs放入代码中时(由于它与C 交错 ,因此无法进行调试),我无法确切知道它发生的位置。
这是代码:
...
printf("just to check there is no problem accessing "node" %d\n", node);\
printf("this will be printed\n"); \
node_type##_Destroy(node); \
printf("this will not be printed\n"); \
...
并且Destroy的代码如下:
int name##_Destroy( name##_p name ) \
{ \
printf("this will not be printed\n"); \
...
我没有修改这部分代码( printfs除外),所以我认为还可以。 您知道这里会发生什么吗?
这段代码中有两个危险信号,但是您对我们的了解还不够。
printf("just to check there is no problem accessing "node" %d\n", node);\
printf("this will be printed\n"); \
node_type##_Destroy(node); \
printf("this will not be printed\n"); \
显然这是一个宏,但是它是一个多语句宏。 这是搞砸宏的最简单方法,因为可以这样调用它:
#define MACRO() puts("A"); puts("B")
// prints "B"
if (0) MACRO();
其次,该字符串常量非常可疑:
"just to check there is no problem accessing "node" %d\n", node
请注意, node
据说是一个int
,但它出现在两个字符串常量之间,没有编译错误。 一个int
不能做到这一点,所以node
可能不完全是一个int
。 这可能是一个完整的表达方式,谁知道呢?
删除段错误几乎总是指向损坏的堆。 某些东西破坏了指针所在的堆(或它跟踪上一个/下一个指针的位置)并导致跳转到超空间。 托管代码使这种可能性降低了,但是仍然是我开始的地方。
谢谢您的回答。 现在我知道发生了什么。
迪特里希EPP,确实节点不是一个int(我只是想知道是否有访问它,因为我被错误搞砸了,并没有关于发生了什么事的线索有问题)。 感谢您警告我有关C宏的信息。 我读了一些,最后我弄清楚了正在发生什么。
node_type类型为agent 。 因此,宏扩展为agent_Destroy(node)。 问题在于,在Mobile C代码中有一个比名为agent_Destroy(agent_p agent)的函数。 发生的事情是两个函数都执行了,第一个函数是直接在代码中定义的,存在分段错误的函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.