枚举数据类型和gcc

枚举数据类型和gcc,c,linux,enums,C,Linux,Enums,我有一个函数,其中一个函数参数是整数。在函数调用期间,我将枚举数据类型传递给该函数。在使用gcc构建之后,对函数内整数变量的任何访问都会导致分段错误 示例代码: void somefun(unsigned int nState) { switch(nState)/首先,枚举是在main()中定义的,对于somefun()不存在。您应该在main之外定义枚举,尽管我看不出这是如何导致崩溃的 在定义了main之外的枚举之后,您应该将somefun定义为somefun(E_STATE nState)并

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

示例代码:
void somefun(unsigned int nState)
{

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


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

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

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

实际上为我运行:

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 $ 
仍然有效。您的版本中是否有核心文件?您是否尝试过获取堆栈跟踪?

实际上为我运行:

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 $ 

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

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

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

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

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

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

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

Since nState根本没有在交换机中使用,是不是经过优化了。总之,奔腾4 PC中的gcc版本3.4.6-10(Redhat)听起来不错。代码对我来说仍然有效。既然nState经过优化,但没有被访问,为什么会崩溃?既然nState根本没有在交换机中使用,是不是经过优化了。总之,gcc版本3.4.6-10(Redhat),在奔腾4 PC中。听起来不错。代码对我仍然有效。由于nState正在优化,但没有被访问,为什么它会崩溃?嗯,没有;由于参数声明为unsigned int,函数不关心枚举,而且由于C中的枚举是int,所以调用只是将int转换为uint。没有问题。确切地说,I应该,还有我说的。但是展示使用枚举的正确方法并没有什么坏处。好吧,不;因为参数声明为unsigned int,所以函数不关心枚举,因为C中的枚举是int,调用只是将int转换为uint。没问题。这正是我的想法和我说的。但是展示正确使用枚举的方法。使用-g和-Wall编译它并发布任何警告。另外,在gdb中运行它以确定它到底是如何崩溃的。使用-g和-Wall编译它并发布任何警告。另外,在gdb中运行它以确定它到底是如何崩溃的。
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 $