我是 c 的新手,目前正在学习指针,我所知道的是指针指向它指向的任何内容的内存地址。
我的问题是,您如何准确分配字符长度的内存,否则需要 50 个字节?
假设他们输入了一个标题:饥饿游戏
BOOL AddNewDVD(Database* data){
}
最佳答案
I am new to c and learning pointers
指针对初学者来说很难。确保您打下坚实的基础。
at the moment what I know is that pointer points to the memory address of whatever it points to.
虽然这在实践中是正确的,但我不喜欢这样想。您所描述的是指针通常如何实现,而不是概念上。通过将实现与概念混淆,您会为以后编写错误代码而做出无根据的假设做好准备。不要求指针是一个数字,它是虚拟内存系统中的地址。
更好的理解指针的方式不是地址,而是:
- 指向 t 的指针是一个值。
- 将
*
运算符应用于指向 t 的指针,得到类型为 t 的变量。 - 将
&
运算符应用于类型为 t 的变量会为您提供指向 t 的指针。 - 类型 t 的变量可以获取或存储类型 t 的值。
- 数组是一组变量,每个变量由一个索引标识。
- 如果指针引用数组中与索引 i 关联的变量,则 p + x 会为您提供一个指针,该指针引用与索引 i + x 关联的变量。
- 将
[i]
运算符应用于指针是*(p+i)
的简写。
也就是说,与其将指针视为指向内存中某个位置的数字,不如将其视为可以强制为您提供变量的东西。
is this how you allocates memory exactly the length of the scanned string or it will take 50 bytes?
char *title = malloc(50 * sizeof(char));
scanf(" %[^\n]s", title);
malloc(50*sizeof(char))
为您提供一个包含 50 个字符的数组。
title
是指向 char
的指针。
取消引用时,title
将为您提供与数组中第一项关联的变量。 (项目零;请记住,索引是与第一项的距离,而第一项与第一项的距离为零。)
scanf
将用户键入的字符填充到您的 50 个字符数组中。
如果他们输入超过 49 个字符(请记住,按照惯例末尾将放置一个零字符),那么可能会发生任意糟糕的事情。
正如您正确注意到的那样,您要么浪费了大量空间,要么可能溢出缓冲区。解决方案是:不要对任何生产代码使用 scanf。这太危险了。而是使用 fgets
。有关详细信息,请参阅此问题:
关于c - 将内存分配给具有精确字符长度的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21053573/