为什么此代码在特定值后失败

时间:2011-12-16 06:32:14

标签: c

代码:

int main(int argc, char *argv[])
{
    typedef struct lb_data_US
    {
        char uname[255];
        char Eid[4];
        char myrole[4];
        char Login_t[30];
        char Logout_t[30];
        char ClientIP[20];
        char ZoneName[256];
    };

    int x = atoi(argv[1]);
    lb_data_US  lb_local[x];
    printf("stands for %d value\n", x);
    exit(0);
}

当我使用./structure_testop 20995运行此代码时,它会完全运行但是当我使用更大的参数(例如20996或更多)运行此代码时,它偶尔会失败... 当我试图通过gdb调试它时说

Program received signal SIGSEGV, Segmentation fault.
0x003d6773 in _IO_vfprintf_internal (s=<value optimized out>, format=<value optimized out>, ap=<value optimized out>)
at vfprintf.c:233
233       int save_errno = errno;
Current language:  auto; currently c"

任何人都能解释一下吗?

2 个答案:

答案 0 :(得分:2)

假设您实际上正在使用支持动态数组大小调整的C ++,请考虑20995的参数:它动态分配20995次sizeof lb_data_US(大约600),总分配为12.5+兆字节。很少有环境支持如此大的堆栈大小。相反,请使用许多环境中支持的堆malloc()来处理进程限制大小。

答案 1 :(得分:1)

int x=atoi(argv[1]);
lb_data_US lb_local[x];

您无法使用int指定在堆栈中分配的数组的大小,其值在运行时确定。它仅适用于in C99 mode or as an GCC's extension to C90。如果您的编译器不支持它,请使用malloc代替。

lb_data_US *lb_local = malloc(x * sizeof(lb_data_US));

如果您想强制编译器使用C99模式,通常可以通过将-std=c99添加到编译器的执行参数来实现。