1

假设我有以下字符串:

char *my_string = "Stack";

据我所知char *,保存字符串第一个字符的内存地址"Stack"。在计算机内存中,它可能表示如下:

 ------------------------
| S | t | a | c | k | \0|
 ------------------------
  ^
  my_string

如果我调用: printf("%s\n", my_string);,则会打印整个字符串。编译器如何知道打印整个字符串?因为据我了解,它只有一个字符的地址。

4

6 回答 6

7

char*确实只指向字符串的第一个字符,但是像这样的函数将printf("%s")简单地开始读取并继续,直到它们找到一个 0 字节。默认情况下,像您的示例这样的字符串文字"Stack"以零结尾,因此printf会知道打印您的字符串并在此之后停止。

于 2014-10-10T08:06:57.917 回答
6

编译器除了编译你的程序之外什么都不做。

但是,库函数对您printf提出了以下要求(并且您恰好满足此要求):当给定格式说明符时,相应的参数必须是 type ,并且假定指向以零结尾的第一个元素字符数组。然后该函数将打印出该数组的连续元素,直到它达到零字节。%schar *

于 2014-10-10T08:08:04.177 回答
2

因为它知道一个字符有多大,它可以计算第二个字符的地址并打印出来(基本上是在原始指针上加 1)。然后它可以再次执行相同的操作以获取第三个字符,依此类推,直到'\0'找到具有该值的字符并且字符串被认为结束。

于 2014-10-10T08:07:27.143 回答
2

char*只是一个指向字符串开头的指针。许多 C 函数(printf、strcpy、strlen、...)取决于'\0'传递给它们的指针恰好指向的字符串末尾的终止符。在将指向字符串的指针传递给此类函数时,请务必记住终止字符串,'\0'以避免未定义的行为、分段错误、访问冲突等。

于 2014-10-10T08:12:14.087 回答
1

编译器对传递的变量地址的大小或类型一无所知,因此当您传递 char 的第一个地址并使用字符串的说明符时%s,编译器只知道传递的地址,它必须将地址解释为一个字符串。所以通常 printf 打印所有字符并在读取\0空指针时结束执行。字符串基本上只是以空指针结尾的 char 集合\0

于 2017-03-11T16:13:17.747 回答
0

char *my_string = "堆栈"; 这意味着以下几点:

  1. my_string 是指向 char 'S' 的指针
  2. 在增加指针时,它将增加 sizeof(char)。

正如大多数人所引用的那样,添加一个观察结果:如果您用其他任何内容覆盖普通字符串的 '\0' 地址,它将继续打印,直到遇到 '\0'(一种诱导网络攻击的技术)。

于 2014-10-10T10:41:51.777 回答