我有一个函数,其中一个函数参数是一个整数。在函数调用期间,我将枚举数据类型传递给此函数。使用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);
}
答案 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)
从您的所有答案中看来,代码在逻辑上是正确的,我需要调查崩溃的真实原因。我会调查并尽快发布。