我应该总是动态分配数组,只是为了安全吗?

时间:2016-03-20 23:47:04

标签: 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);

1 个答案:

答案 0 :(得分:4)

不,你不应该。

如果您在编译时不知道它们的大小,则应动态分配数组。 如果您在编译时知道大小,请静态分配。

在这两种情况下,你应该三思而后行 - 例如如果你忘记了C-String末尾的'\0',你最终会写入你没有分配的内存。

在您的计划中,问题是您使用gets() unusably dangerous。它几乎肯定会溢出你的字符串,导致未定义的行为。在您的程序中,未定义的行为表现为对整数数组的意外更改。与字符串相比,使用动态内存分配更改了存储数组的位置;它改变了未定义的行为,但没有解决问题(这是你溢出字符串缓冲区并调用未定义的行为)。