你好, 欢迎回来｡
在这堂课中, 我想为我们之前的挑战提供一个演示,
那就是让你理解如何使用malloc动态分配内存｡
我们只需要从键盘上阅读字符串, 然后显示出来, 我们会用动态分配的指针,
字符指针.
因此, 让我们调出代码块, 创建一个新项目｡
我们只举一个动态内存分配的例子｡
当你要使用动态内存分配的时候, 你需要做的第一件事就是你必须确保你包括了标准库｡
幸运的是, 当您在代码块中创建一个项目时,
它会自动为您包含它｡
但是我们需要包含标准lib的原因是因为malloc, malloc函数在里面｡
记住, malloc是分配内存的主要函数｡ 你也有胼胝｡
Calloc非常重要, 因为calloc会很好地计算出所需的字节数, 因为这是两个参数｡
但是calloc真实的的好处是它会把所有的整型数据初始化为零, 非常好的函数.
您有重新分配的空间｡ 重新分配将扩展已分配的内存｡
所以你把它传递给一个指针｡
从这个指针开始,
它决定了分配给它多少内存, 它会把所有的内容复制到一个新的内存位置, 然后你还可以指定你想分配多少字节,
只要把它添加到新的内存位置, 这是一个很好的功能｡
但是请记住,
当你使用malloc为整数分配内存时, 你必须确定你想分配多少字节的内存, 但是你通常想使用sizeof操作符｡
现在让我们来谈谈这个问题｡
在我的main方法中, 我会创建一个整数,
我会说它就是size.
会输入运行时要分配的字节数, 所以它会存储该大小.
我想创建的另一个东西是一个字符指针, 它是文本.
我会把它初始化为null因为它没有直接指向任何东西.
现在, 我首先要做的是让用户输入大小｡
所以我会输入printf, 输入文本的极限值.
他们将输入一个数字, 表示要分配多少字节, 实际上是字符数｡
然后我会用scanf把它读入｡
第一个参数是数据类型的格式说明符的类型｡
这里是% d, 因为我阅读的是一个整数｡
然后记住scanf需要一个指针｡
我们现在知道,
对于那些接受指针的函数, 你需要一个地址来传入｡
所以如果我要传入size, size不是地址除非我用运算符的地址.
我将使用&符号和size, 读取字节数.
一旦我有了字节数, 我就可以使用malloc函数为它分配内存了｡
malloc将返回一个void指针｡
指针将是新分配内存的第一个地址｡
因此您可以将它的权限分配给文本｡
因为记住, 文本是一个指针｡
我们希望将文本指向要返回的新地址｡
因为malloc返回一个void指针, 所以我们必须强制转换它｡
我们所指向的数据类型是一个字符, 所以我们想用char, 星星,
然后调用malloc函数.
malloc函数采用字节数｡
所以字节数, 如果你只是传入字节数, 它只会分配那么多字节｡
但是取决于数据的类型, 数据的类型可以是两个或四个字节｡
所以如果你想分配10个字符, 你要确保你把10个字符乘以char的大小｡
所以现在我们要说n乘以sizeof｡
sizeof操作符经常用在malloc函数中,
因为它是独立于机器的, 它会告诉你实际需要分配多少｡
当你有整数的时候, 这就更有意义了｡ 记住,
整数, 根据你所使用的系统,
你所运行的体系结构, 整数可以用四个字节, 两个字节, 通常是两个或四个字节来表示｡
如果你说我想存储一个整数,
那么我只需要创建四个字节的内存, 这可能是不正确的, 因为如果是两个字节呢？
所以你总是想知道你想创建多少个整数或者多少个字符, 然后乘以你系统中字符的大小｡
Sizeof运算符将为您给予一个char所占用的字节数｡
所以如果你想创建10个字符, 你可以说是字符大小的10倍｡ 如果你想创建10个整数来存储10个整数,
你说10乘以int的大小, 这真的很重要｡
现在有了calloc函数, 您就不必这样做了｡
Calloc实际上有两个参数｡
第一个参数是指针,
第二个参数是字节的大小｡
如果你说24 int, 那么你所要做的就是传入24,
然后自动为你分配｡
所以calloc是一个非常好用的工具, 因为你不需要做乘法｡
因此对于calloc, 第一个参数是大小｡
所以如果你想创建10个int, 你只要传入10就行了.
第二个参数是字节的大小｡
所以你不必做乘法｡ 这样可以省去一点步骤｡
现在我们已经分配了内存, 在尝试取消引用文本之前, 您需要确保文本不为空｡
所以你总是想把它包在一个非文本上,
这样就表示它不为空, 或者你可以显式地这样做, 如果文本不等于空｡
我总是想这样做, 因为试图解引用指针是非常非常危险的｡
任何事都有可能发生｡ 你也许可以把数据写入其中｡
进入其中｡ 它只会把它写在内存的其他地方｡
所以它会搞砸你的程序或者你可能有一个分段错误, 程序可能会崩溃｡
但是只要你真的分配了那个内存,
你现在就可以实际读入一些数据了｡
你可以在这里使用git s或者scanf｡
但是你要做的是打印出来,
输入一些文本, 我们还想在这里添加换行符, 这样它们就容易阅读了｡
我们将使用scanf, 因为这是我们所熟悉的｡
scanf的单位是百分比｡
其实, 我要给你看个小把戏｡
我将使用scanf读入下一个字符,
这样它会暂停, 然后我将使用get s读入文本｡
而gets只是另一个函数, 通常你可以使用f gets｡ 您只需要将它设置为输入流｡
但是gets将从标准输入流中读取, 默认情况下是键盘｡
而gets将需要一个指针｡
所以我们要做的就是传入文本因为它已经是一个指针了, 我们不需要输入运算符的地址｡
get asks的好处是可以读入多个由空格分隔的字符串｡
一旦我们读入了gets, 我们就可以打印出来了｡
因此, 我们可以说输入的文本, 如果输入的是一个词, 百分比,
反斜杠, 然后逗号文本｡ 文本是指针｡
Printf接受一个指针｡ 我们不需要取消引用它｡
因为如果你只显示文本,
文本会显示指针的值, 指针的值是地址.
我们实际上想显示文本所指向的值｡
然后我们就完事了｡ 哦不, 我们肯定还没说完｡ 我们要叫我们的自由｡
我们要释放指针｡
即使当我们退出时, 内存将是空闲的｡
我们仍然要确保释放它, 然后我们可能还想为了安全起见, 我们想把text设置为null｡
让我们继续构建它, 看看会发生什么｡
我确实有个问题因为我没有阅读正确的变量｡
所以这里我没有使用正确的变量｡
我想用尺寸, 看起来我们没问题｡
这里我们开始了, 一个不同之处是, 你不必取消引用文本,
因为文本是一个字符指针｡
只有在指针等情况下才需要取消引用｡
所以当你使用percent的时候, 它会自动知道去引用字符指针｡
这是使用字符指针与使用其他指针的一个区别｡
其他的指针你必须去引用才能得到值, 因为你不能把字符串复制到字符串数组等等｡
你永远不能做星星文本等于,
你必须始终使用字符串复制, 如果你想复制文本｡
记住,
在课堂上, 你不能给数组赋值, 字符指针也是数组.
这里看起来是正确的｡ 没有理由取消引用它｡
我们想建立这个, 然后我们想运行它｡
而且你会注意到我们把文字的限制｡
假设我们输入5, 6给jason,
它会打印出输入是jason｡
而且你可以玩这个程序｡
但同样, 这里的要点包括在执行malloc时使用标准lib｡
将字符指针初始化为null｡
执行scanf, 使用&符号, 因为size不是指针｡
当你进行malloc时, malloc返回一个void指针, 所以你必须强制转换｡
你总是想在你的malloc里面｡
对要分配的内容执行sizeof运算符｡ 次, 实际字符数为或整数｡
从技术上讲, 这更适用于整数和字符的基元数据类型｡ 你可以只做大小, 这应该工作的罚款｡
您总是希望检查是否为null, 请确保它不为null｡
当你去使用字符串｡
然后我们只需输入一些文本, 存储在我们的get中并打印出来｡
最后但同样重要的是, 我们总是想释放指针, 这样我们就可以给予指针还给堆｡
希望这对你有帮助｡ -谢谢—谢谢