繁体   English   中英

使用C宏的分段错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM