c - 为了安全起见,我应该始终动态分配数组吗?

标签 c arrays

我正在编写一个简单的程序并创建一个数组来存储 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/

相关文章:

c - 如何在c中将字符串从一维数组复制到二维数组?

arrays - 如何在 m 排序数组中找到一个元素,其中数组的其余部分为零且未给出 m

php - 我什么时候应该在 php 中定义一个新数组?

arrays - 将字符串转换为符号并将它们 ".push"转换为数组

c++ - 结构位域最大大小(C99,C++)

c - 如何获取一个16位变量的高8位?

c - 案例循环有问题

c - 在纬度/经度与 DMS 之间相互转换时遇到问题

java - Java中使用foreach对整数数组进行排序

java - 当对象是数组时将对象转换为字符串(java)