【发布时间】:2018-06-20 14:40:13
【问题描述】:
看看这个:
char* s;
scanf("%s", s);
一般来说,s 是一个“内存盒”,其中包含指向另一个地址的地址,在这种情况下,它将是许多“内存盒”中的第一个,其中包含标记结束的“\0”之前的字符字符串。
*s 可以让我们访问“内存盒”,即字符串。
现在回到代码,准确地说是 scanf,我是这样读的:获取用户输入,这是一个字符串,因此是“%s”,并将其分配给 s。但这怎么可能呢? s 是参考,所以不应该是scanf("%s", *s) 吗?
【问题讨论】:
-
documentation for
scanf清楚地说明了应该为哪种格式说明符传递哪些类型。同样*s会返回一个单数char,而不是一个字符串。 -
char * s不会创建“内存盒”。我想你的意思是像char * s = malloc(80);这样的东西创建了一个能够容纳 80 个字节的“内存盒”,以后必须释放它。 -
最好使用“指针”这个短语。这是一个技术词,描述了它的作用。它不是事物本身,它指向事物。您应该寻找一些 scanf() 的示例。您在撰写本文时的示例不正确。您需要一些内存来存放字符串。该字符串是许多“char”。您需要一个指向该内存的指针。指针只能指向第一个。然后将指针传递给scanf(),它将查找字符串并将其放入指针指向的内存中。
-
@archaic 将许多字符读入一个小缓冲区是缓冲区溢出。缓冲区溢出会导致未定义的行为。未定义的行为正是如此。