当你打印 string 时,我们需要字符串的起始地址。
printf("%s\n", ptr);
^ address with %s
它会打印字符直到遇到\0 nul。
而要打印 chat int .. 我们需要 值变量:
printf("%c\n", *ptr);
^ * with %c print first char
在 scanf() 一个字符串中,您总是需要提供地址:
scanf("%s", ptr);
^ string address
也适用于 int scanf() 一个字符
scanf("%c", ptr);
^ read at first location char address
注意:Scanf() 需要与%c 的地址才能将扫描的值存储在内存中。
小心你的ptr指向一个常量字符串,所以你不能在scanf中使用。
为什么分段错误有以下代码?
printf("%s\n", *ptr);
当你这样做时,因为%s printf 将*ptr 解释为一个地址,但它实际上不是一个地址,如果你把它当作地址,它指向某个为你的程序读保护的位置(进程) 所以它会导致分段错误。
您的ptr 通过name 指向内存中的某个常量字符串(“Jordan”),如下图所示:
name 2002
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ 'J' │ 'o' │ 'r' │ 'd' │ 'a' │ 'n' │'\0' │ ........
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
^
|
ptr = name
==> ptr = 2002
*ptr = 'J'
在printf("%s\n", *ptr); 中,*ptr = 'J' 和 char 'J' 的 ASCII 值是 74 但74 地址不在您的进程控制之下,您正试图从该内存位置读取,并且它存在内存冲突和发生分段错误。
如果您编译包含printf("%s\n", *ptr); 的代码,然后使用正确的选项说-Wall 和GCC,您将收到如下警告:
warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’
说%s 需要(期望)char* 类型的地址,但你正在投入价值
注意:
printf("%s\n", *ptr);
^ ^ argument-2
argument-1