我正在编写一个简单的程序并创建了一个存储4个整数的数组。然后我使用for
循环来分配它们;在那之后,我使用gets()
函数来获取字符串;使用gets()
函数后,数组上的第一个整数总是变为0.我甚至在gets()
之前和之后在屏幕上打印变量进行确认。
唯一修复它的是动态分配数组,所以现在我想知道是否应该总是动态分配数组以防止出现这种问题?
代码:
int nums[4];
int i = 0;
char symbols[3];
for(i=0;i<4;i++){
scanf("%d", &nums[i]);
}
fflush(stdin);
gets(symbols);
calculate(nums, symbols);
答案 0 :(得分:4)
不,你不应该。
如果您在编译时不知道它们的大小,则应动态分配数组。 如果您在编译时知道大小,请静态分配。
在这两种情况下,你应该三思而后行 - 例如如果你忘记了C-String末尾的'\0'
,你最终会写入你没有分配的内存。
在您的计划中,问题是您使用gets()
unusably dangerous。它几乎肯定会溢出你的字符串,导致未定义的行为。在您的程序中,未定义的行为表现为对整数数组的意外更改。与字符串相比,使用动态内存分配更改了存储数组的位置;它改变了未定义的行为,但没有解决问题(这是你溢出字符串缓冲区并调用未定义的行为)。