c - 将内存分配给具有精确字符长度的指针

标签 c pointers memory-management

我是 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。有关详细信息,请参阅此问题:

How to use sscanf correctly and safely

关于c - 将内存分配给具有精确字符长度的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21053573/

相关文章:

java - 如何通过 JNI 将 HashMap 从 Java 发送到 C

c - 从控制台读取字符

c++ - C++ 中带有 void 指针的单元测试函数

django - Heroku 上的内存监控

c - 03优化后如何列出任意c程序使用的所有库函数

c - 神奇地撤消 fprintf 格式错误

c - 如何打印字符**

c++ - 线程 1 : EXC_BAD_ACCESS (code=1, 地址=0x0) 错误

创建一个包含指针的数组

c 内存分配和数组的数组