枚举数据类型和gcc

时间:2009-03-05 04:55:36

标签: c linux enums

我有一个函数,其中一个函数参数是一个整数。在函数调用期间,我将枚举数据类型传递给此函数。使用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);
}

5 个答案:

答案 0 :(得分:1)

首先,枚举在main()中定义,而somefun()则不存在。你应该在main之外定义枚举,虽然我看不出它是如何导致崩溃的。

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

答案 1 :(得分:1)

实际上为我跑:

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)在交换机中添加了一个标签,以便它有一些东西; (2)添加了#include <stdio.h>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 $ 

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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