当你声明一个指针时,你所做的只是留出空间来存储另一个对象的地址;您没有为其他对象本身留出任何空间。
这是一个假设的内存映射(地址是凭空提取的,并不代表任何真实字架构,假设是 32 位字):
Item Address 0x00 0x01 0x02 0x03
---- ------- ---- ---- ---- ----
str 0xfff86400 ?? ?? ?? ?? // ?? represents unknown byte value
变量str 位于地址0xfff86400。由于您用auto 声明了str 存储持续时间(即在函数内)并且没有显式初始化它,所以它的值是indeterminate;它包含一个未知的位模式(很可能)不对应于您程序中的可写地址。 gets 尝试将数据写入此 invalid 地址,因此
段错误1。没有一个输入例程(fgets、scanf、fscanf、fread 等)会留出内存来存储实际输入;那是你的责任。
当你想通过一个指针来操作某些东西时,你需要分配指针所指向的东西到。例如,您可以这样做:
char buf[8] = "blah!";
char *str = buf;
这会留出一个缓冲区来存储最多 8 个字符,然后将该缓冲区的第一个元素的地址分配给 str,给我们这样的结果:
Item Address 0x00 0x01 0x02 0x03
---- ------- ---- ---- ---- ----
buffer 0xfff86400 'b' 'l' 'a' 'h'
0xfff86404 '!' 00 ?? ??
str 0xfff86408 ff f8 64 00
同样,您可以使用malloc 来动态地为str 分配内存以指向:
char *str = malloc( BUF_SIZE );
malloc 留出BUF_SIZE 字节来存储您的输入字符串,并将指向该空间的指针分配给str。
1。严格来说,取消引用无效指针的行为是undefined;段错误是许多可能的结果之一。它可以很容易地破坏一些重要的东西,以便您的程序继续运行但现在具有管理员权限。