所以我尝试了这段代码
#include <stdio.h>
int main(void)
{
char string[] = "hello world";
char *my_ptr = string;
*my_ptr='Y';
printf("the first char of string is %c", *my_ptr);
}
OUTPUT_1: -
the first char of string is Y
现在,如果我想在字符串中打印完整的字符(“Yello world”)。为此,我将第7行更改为: -
printf("the whole string is %s", *my_ptr);
OUTPUT_2: -
Segmentation fault (core dumped)
但如果我尝试将其更改为: -
printf("the whole string is %s", my_ptr);
OUTPUT_3: -
the whole string is Yello world
有人可以解释一下,为什么第二个案例失败了?和
为什么第三种情况打印正确?
根据我的理解* my_ptr(以及my_ptr两者)都有第一个位置的地址,那么为什么第一个在打印完整的字符串时失败,而第二个在第二个位置运行良好。我是初学者,所以如果你能详细说明在这些情况下这种行为背后的原因会有所帮助。
答案 0 :(得分:3)
my_ptr
的类型为char *
,它是字符串第一个字符的指针。
*my_ptr
类型为char
,它是一个角色。
printf
格式字符串选项%s
采用char *
,它将循环遍历每个字符,直到找到字符串分隔符(0):
首先,*my_ptr
,是Y
然后是*(my_ptr + 1)
,是
等等......
将printf与*my_ptr
一起使用时,*my_ptr
的内容将传递给printf,就像它是一个字符串指针一样。它的价值是&#39; Y&#39;在ascii中是89。
printf会尝试访问地址89处的指针,认为它是一个有效的字符串指针,但是这个地址很可能无法读取,内核会杀死试图访问它无法访问的内存的程序到。
答案 1 :(得分:0)
这将有效:
#include <stdio.h>
int main(void)
{
char string[] = "hello world";
char *my_ptr = string;
*my_ptr='Y';
printf("the first char of string is %c", *my_ptr);
printf("the whole string is %s", my_ptr);
}
my_ptr
是指向整个字符串的指针。 *my_ptr
是字符串开头的char值。
printf("%s", char*)
printf("%c", char)
答案 2 :(得分:0)
此:
printf("the whole string is %s", *my_ptr);
取消引用指针,因此它将char
类型的值传递给printf()
,然后将其解释为%s
格式说明符)const char *
,即作为只读字符数据的指针。指针的值是存储器中存储某些数据的位置的地址。
这将使printf()
从一些非常低的地址开始读取字符,在那里你的程序不太可能被允许读取。因此分割错误。
答案 3 :(得分:0)
在下面的陈述中:
printf("the whole string is %s", *my_ptr);
它将从* my_ptr的地址中读取内容。这会产生分段错误(核心转储),而在下面:
printf("the whole string is %s", my_ptr);
将从string []的基址读取该字符串。要读取字符串,您必须传递从应该开始字符的基址到读取,直到找到“\ 0”字符。
答案 4 :(得分:0)
reasaon在C中,%s用于打印字符串,但是您使用它来打印导致Core转储的char。
在C中,只需提供基地址即可打印整个内容,无需使用*addr.
如果您想要访问特定字符,您可以*(a+0)
打印第一个字符,* (a+1)
打印第二个字符,依此类推。