c - 为什么我不需要在打印之前取消引用 C 中的字符指针?

标签 c

为什么这段代码有效?我希望我需要取消引用 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 值为 7474 地址不在您的进程控制之下,您正试图从该内存位置读取,但它发生了内存冲突和段错误。

如果您编译包含 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/

相关文章:

c - 后缀计算器不起作用,为什么? - C

c - 为什么程序员使用void*

c - 如何编译c程序使其不依赖于任何库?

c - 按键到非事件窗口

c - 为什么这个语句会报错?

c - 如何唤醒正在 sleep (3)的线程

c - GCC 三元条件运算符中的副作用与值计算?

C 函数中以逗号分隔的返回参数

c - 为什么ebx保存在调用gets的简单函数的栈帧中?

c - Unsigned Char 位访问,确定 char 是否由 1 和 0 组成