我想知道当我写一个少于 100 个字符的单词时会发生什么:
char cad[100];
printf("Cadena: ");
scanf("%s", cad);
因为使用strlen()
我能够验证数组的大小是否已更改。
现在的问题是:不再使用的内存会发生什么情况,例如从大小为 100 的数组变为大小为 5 的数组时?那个内存被释放了吗?这是由操作系统完成的还是什么?
我想知道当我写一个少于 100 个字符的单词时会发生什么:
char cad[100];
printf("Cadena: ");
scanf("%s", cad);
因为使用strlen()
我能够验证数组的大小是否已更改。
现在的问题是:不再使用的内存会发生什么情况,例如从大小为 100 的数组变为大小为 5 的数组时?那个内存被释放了吗?这是由操作系统完成的还是什么?
在您给出的示例中,没有发生任何不好的事情。您已经声明了一个数组,其中包含最多可存储 100 个字符的空间。如果您打算将文本字符串存储在所述数组中,则最多可以存储 99 个字符(请记住,在 C 字符串中必须是 with
\0
,它占据一个位置)。只要您不超过 99 个字符的长度,您的程序就可以正常运行,至少在这一点上是正确的。
你对此感到困惑。
strlen
是一个函数,指示存储的字符串的长度......而不是数组的长度。您声明的该数组是固定大小的,并且正如预期的那样,它的大小在运行时不能以任何方式更改。您可以使用以下方法检查数组的大小没有变化
sizeof
(该示例不适用于动态数组):碰巧它没有被使用……它被浪费了。通常什么都不会发生,因为系统通常有多余的资源......但是你必须小心,因为如果你过度使用它,那么当系统耗尽资源时,程序迟早会失败。
如果您需要更精细的调整以适应每个时刻的需求,则必须更改为动态大小的数组。动态内存要灵活得多,但也需要您控制它的生命周期。
你已经看到它不是。您声明的数组存储在程序的堆栈中,当变量超出范围时,该内存将自动释放。
另一方面,如果数组是动态的,则需要调用以
free
释放内存而不造成内存泄漏。堆内存由应用程序直接控制。对于固定大小的数组,不必担心内存管理,因为您无能为力。