为什么这段代码有效?我希望我需要取消引用 ptr
, printf("%s\n", *ptr);
在我打印出来之前,但我得到了一个 Segmentation Fault
如果我尝试那样做。
#include <stdio.h>
int main(int argc, char *argv[])
{
char name[] = "Jordan";
char *ptr = name;
printf("%s\n", ptr);
}
希望大家多多指教。
最佳答案
当您打印string 时,我们需要字符串的起始地址。
printf("%s\n", ptr);
^ address with %s
它打印字符直到 \0
nul 遇到。
而打印聊天 int ..我们需要值变量:
printf("%c\n", *ptr);
^ * with %c print first char
在 scanf()
字符串中,您始终需要提供地址:
scanf("%s", ptr);
^ string address
也为 int scanf()
一个 char
scanf("%c", ptr);
^ read at first location char address
注意 Scanf()
需要使用%c
的地址来将扫描值存储在内存中。
小心您的ptr
指向常量字符串,因此您不能在scanf 中使用。
Why Segmentation fault with following code ?
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
with GCC
你会得到如下警告:
警告:格式“%s”需要类型为“char *”的参数,但参数 2 的类型为“int”
说 %s
需要(期望)类型为 char*
的地址,但你正在输入值
注意事项:
printf("%s\n", *ptr);
^ ^ argument-2
argument-1
关于c - 为什么我不需要在打印之前取消引用 C 中的字符指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15841696/