我正在编写一个简单的程序并创建一个数组来存储 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);
最佳答案
不,你不应该。
如果您在编译时不知道数组的大小,则应该动态分配数组。 如果您在编译时知道大小,请静态分配它。
在这两种情况下,您都应该仔细考虑尺寸 - 例如如果您忘记了 C 字符串末尾的 '\0'
,您最终将写入未分配的内存中。
在您的程序中,问题是您使用了 gets()
,即 unusably dangerous 。它几乎肯定会溢出你的字符串,导致未定义的行为。在您的程序中,未定义的行为表现为对整数数组的意外更改。与字符串相比,使用动态内存分配改变了数组的存储位置;它改变了未定义的行为,但没有解决问题(即您这样做时溢出了字符串缓冲区并调用了未定义的行为)。
关于c - 为了安全起见,我应该始终动态分配数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36121056/