代码:
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"
任何人都能解释一下吗?
答案 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
添加到编译器的执行参数来实现。