Tag: goto

转到C中的特定地址

我如何JMP到C中的特定地址? 我想用 goto 0x10080000 这是行不通的,还有其他方法可以改变程序计数器的地址吗?

局部变量之前的GOTO

以下代码是否构成未定义的行为,因为我在变量声明之前跳转并通过指针使用它? 如果是这样,标准之间是否存在差异? int main() { int *p = 0; label1: if (p) { printf(“%d\n”, *p); return 0; } int i = 999; p = &i; goto label1; return -1; }

C:嵌套的Ifs或Gotos

管理C程序资源的最佳方法是什么? 我应该使用嵌套的if结构还是应该使用goto语句? 我知道goto语句有很多禁忌 。 但是,我认为当地资源清理是合理的。 我提供了两个样本。 一个比较嵌套的if结构,另一个使用goto语句。 我个人发现goto语句使代码更容易阅读。 对于那些可能认为嵌套if提示更好的结构的人来说,想象一下如果数据类型不是char *,就像Windows句柄一样。 我觉得嵌套的if结构会随着一系列CreateFile函数或任何其他需要大量参数的函数而失控。 本文演示了本地goto语句为C代码创建RAII。 代码很简洁,很容易理解。 想象一下,作为一系列嵌套的if语句。 我知道goto在许多其他语言中都是禁忌,因为它们存在其他控制机制,如try / catch等,但是,在C中似乎是合适的。 #include #define STRING_MAX 10 void gotoExample() { char *string1, *string2, *string3, *string4, *string5; if ( !(string1 = (char*) calloc(STRING_MAX, sizeof(char))) ) goto gotoExample_string1; if ( !(string2 = (char*) calloc(STRING_MAX, sizeof(char))) ) goto gotoExample_string2; if ( !(string3 = (char*) […]

C / C ++:转到for循环

我有点不寻常的情况 – 我想使用goto语句跳转到循环中,而不是跳出它。 有充分的理由这样做 – 这段代码必须是某个函数的一部分,它在第一次调用后进行一些计算,返回请求新数据并需要再继续调用一次。 无法使用函数指针(明显的解决方案),因为我们需要与不支持函数指针的代码进行互操作。 我想知道下面的代码是否安全,即它将由所有符合标准的C / C ++编译器正确编译(我们需要C和C ++)。 function foo(int not_a_first_call, int *data_to_request, …other parameters… ) { if( not_a_first_call ) goto request_handler; for(i=0; i<n; i++) { *data_to_request = i; return; request_handler: …process data… } } 我已经研究过标准,但关于这种用例的信息并不多。 我也想知道从便携性角度来看,替换等价物是否有益。 提前致谢。 UPD :感谢所有评论过的人! 对所有评论者:)是的,我明白我不能跳过局部变量的初始化器,我必须在每次调用时保存/恢复i 。 关于强大的原因:)这段代码必须实现反向通信接口。 反向通信是一种试图避免使用函数指针的编码模式。 有时必须使用它,因为遗留代码需要您使用它。 不幸的是,r-comm-interface无法以很好的方式实现。 您不能使用函数指针,也无法轻松地将工作拆分为多个函数。

如何让GDB摆脱循环?

我可以告诉GDB使用return立即从函数return ,并使用call myFunction调用函数。 但是如何让它摆脱目前的循环呢? 即表现好像是break; 声明。 是jump myfile.c:的方法吗?

‘goto * foo’其中foo不是指针。 这是什么?

我正在玩标签作为值 ,最后得到这个代码。 int foo = 0; goto *foo; 我的C / C ++经验告诉我*foo意味着dereference foo并且这不会编译因为foo不是指针。 但它确实编译。 这实际上是做什么的? gcc (Ubuntu 4.9.2-0ubuntu1~12.04) 4.9.2 ,如果重要的话。

是否使用goto?

这个问题可能听起来有些陈词滥调,但我处于这种情况。 我正在尝试实现一个有限状态自动机来解析C中的某个字符串。当我开始编写代码时,我意识到如果我使用标签来标记不同的状态并使用goto从一个状态跳转到另一个案件来了。 在这种情况下使用标准的break和flag变量非常麻烦,很难跟踪状态。 什么方法更好? 最重要的是我担心这会给我的老板留下不好的印象,因为我正在实习。