【问题标题】:enumerated datatypes and gcc枚举数据类型和 gcc
【发布时间】:2009-03-05 04:55:35
【问题描述】:

我有一个函数,其中函数参数之一是整数。在函数调用期间,我将枚举数据类型传递给该函数。使用 gcc 构建后,对函数内部的 INTEGER 变量的任何访问都会导致分段错误。

示例代码:

void somefun (unsigned int nState)
{
    switch (nState) // <-- Crashes on this line
    {
        //
        // functionality here ...
        //
    }
}

enum {

    UNDEFINED = -1,
    STATE_NICE,
    STATE_GREEDY
} E_STATE;

int main (int argc, char *argv [])
{
    somefun (STATE_NICE);
}

【问题讨论】:

  • 用 -g 和 -Wall 编译它并发布任何警告。此外,在 gdb 中运行它以确定它究竟是如何崩溃的。

标签: c linux enums


【解决方案1】:

首先,枚举在 main() 中定义,并且对于 somefun() 不存在。您应该在 main 之外定义枚举,尽管我看不出这是如何导致崩溃的。

在 main 之外定义枚举后,您应该将 somefun 定义为 somefun( E_STATE nState ) 并再次测试。

【讨论】:

  • 嗯,不;由于参数声明为 unsigned int,因此该函数不关心枚举,并且由于 C 中的枚举是 int,因此调用只是将 int 转换为 uint。没问题。
  • 正是我的想法和我所说的。但是展示使用枚举的正确方法并没有什么坏处。
【解决方案2】:

我使用 gcc 4.2.4 版在我的计算机上完全编译并运行了该代码(剪切和粘贴),没有错误或分段错误。我相信问题可能出在其他地方。

【讨论】:

    【解决方案3】:

    实际上为我运行:

    bash $ cat bar.c
    #include <stdio.h>
    
    void somefun (unsigned int nState)
    {
        switch (nState) // <-- Crashes on this line
        {
            //
            // functionality here ...
            //
          default:
            printf("Hello?\n");
        }
    }
    
    int main (int argc, char *argv [])
    {
        enum {
    
            UNDEFINED = -1,
            STATE_NICE,
            STATE_GREEDY
        } E_STATE;
    
        somefun (STATE_NICE);
        return 0;
    }
    bash $ gcc -Wall bar.c -o bar
    bar.c: In function 'main':
    bar.c:22: warning: unused variable 'E_STATE'
    bash $ ./bar
    Hello?
    bash $ 
    

    进行了一些更改,但没有它们就可以运行。 (1) 在 switch 中添加一个标签,让它有一些东西; (2) 添加了#include &lt;stdio.h&gt;printf,这样我就知道它已经运行了; (3) 添加return 0; 以消除无意义的警告。

    它确实在没有任何更改的情况下成功运行,只是没有做任何可见的事情。

    那么,什么是操作系统,什么是硬件架构?

    更新

    在我尝试的时候代码发生了变化,所以这里是更新版本的测试:

    bash $ cat bar-prime.c
    #include <stdio.h>
    
    void somefun (unsigned int nState)
    {
        switch (nState) // <-- Crashes on this line
        {
            //
            // functionality here ...
            //
          default:
            printf("Hello?\n");
        }
    }
    
    enum {
    
        UNDEFINED = -1,
        STATE_NICE,
        STATE_GREEDY
    } E_STATE;
    
    
    int main (int argc, char *argv [])
    {
    
        somefun (STATE_NICE);
        return 0;
    }
    bash $ gcc -Wall bar-prime.c -o bar-prime && ./bar-prime
    Hello?
    bash $ 
    

    仍然有效。您是否在您的版本中获得核心文件?您是否尝试过获取堆栈跟踪?

    【讨论】:

    • 由于交换机中根本没有使用nState,是否对其进行了优化。无论如何,gcc 版本 3.4.6-10 (Redhat),在 Pentium 4 PC 中。
    • 听起来不错。代码仍然对我有用。既然 nState 被优化掉了,但没有被访问,为什么会崩溃呢?
    【解决方案4】:

    您的情况是特定于 sun sparc 硬件或类似的。请发布 uname -a 和 dmesg 的输出

    【讨论】:

      【解决方案5】:

      从您的所有回答看来,代码在逻辑上是正确的,我需要调查导致崩溃的真正原因。我会调查它并尽快发布。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-18
        • 1970-01-01
        相关资源
        最近更新 更多