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

C 为什么此代码在指定值后失败,c,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 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\u 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"
程序接收信号SIGSEGV,分段故障。
0x003d6773位于内部(s=,格式=,ap=)
at vfprintf.c:233
233 int save_errno=errno;
当前语言:自动;目前为“c”
有人能解释一下吗

int x=atoi(argv[1]);
lb_data_US lb_local[x];
不能使用运行时确定其值的
int
指定堆栈中分配的数组的大小。它只起作用。如果编译器不支持,请改用它


如果你想强制编译器使用C99模式,通常可以通过将<代码> -STD= C99 < /C>添加到编译器的执行参数中。

< P>假设你实际上使用C++支持动态数组大小,那么考虑20995的参数:它动态分配20995次<代码> siZeof LBYDATAUUS (约为600)以获得12.5 MB以上的总分配。很少有环境支持如此大的堆栈大小。相反,请通过
malloc()使用堆
在许多环境中都支持进程限制大小。

我不相信这是您的完整源代码。是的,实际上我被要求调试一个大型代码…我得出结论,该代码在失败时有一个非常类似的情况。您使用的是什么编译器和操作系统,以及如何编译此代码?g++编译器我实际上是由这个命令编译的……”g++-o testfile_op testfile.cpp“由于它是纯C,您应该使用
gcc
并将文件命名为
*.C
。但如果是这种情况,那么当输入的值小于int时,如何将其赋值……请原谅我的无知……我在programmingJan中是新的,您所说的过去是正确的,但在C99中不再正确。请参阅:jayant,您的意思是为使用malloc分配的数组的元素赋值吗?查找数组[索引].field_name=…并查看字符串的
strcpy
memcpy
。嗯,我明白你的意思了……事实上“lb_data_US*lb_local=malloc(x*sizeof(lb_data_US))”这是一个错误,表示从void*到lb_data_US*的转换无效…但它起作用了…这对我们的帮助人员来说是无效的。。谢谢…我得到了第一点…但是有什么区别…我们可以使用malloc()在堆中分配这么大的内存吗?是的。MALOC允许使用所有可用的内存,然后使用虚拟内存系统。谢谢……你能给我推荐一本关于内存工作的电子书吗?不,C++不支持可变长度数组(它不需要它,因为它有“代码> STD::向量< /代码>”之类的东西。VLA是根据1999年的ISO标准添加到C中的,并且作为一些编译器(包括gcc)的扩展也支持VLA。
lb_data_US *lb_local = malloc(x * sizeof(lb_data_US));