我们说我有以下字符串:
char *my_string = "Stack";
据我所知char *
保存字符串"Stack"
的第一个字符的内存地址。在计算机内存中,它可能表示如下:
------------------------
| S | t | a | c | k | \0|
------------------------
^
my_string
如果我致电:printf("%s\n", my_string);
,则会打印整个字符串。编译器如何知道打印整个字符串?据我所知,它只有一个角色的地址。
答案 0 :(得分:7)
char*
确实只指向字符串的第一个字符,但像printf("%s")
这样的函数只会开始读取并继续,直到找到0字节为止。像"Stack"
示例这样的字符串文字默认为零终止,因此printf
会知道打印字符串并在此之后停止。
答案 1 :(得分:6)
除了编译程序之外,编译器不会做任何事情。
但是,库函数printf
向您提出以下要求 (并且您碰巧满足此要求):当给定格式说明符%s
时,相应的参数必须是char *
类型,并且假定指向零终止字符数组的第一个元素。然后,该函数将打印出该数组的连续元素,直到它达到零字节为止。
答案 2 :(得分:2)
因为它知道一个字符有多大,所以它可以计算第二个字符的地址并打印它(基本上通过在原始指针上加1)。然后它可以再次执行相同的操作以获取第三个字符,依此类推,直到找到值为'\0'
的字符并且该字符串被视为结束。
答案 3 :(得分:2)
char*
只是一个指向字符串开头的指针。许多C函数(printf,strcpy,strlen,...)依赖于字符串末尾的终止'\0'
,传递给它们的指针恰好指向它。始终记得在将指向字符串的指针传递给此类函数时使用'\0'
终止字符串,以避免未定义的行为,分段错误,访问冲突等。
答案 4 :(得分:1)
编译器不知道传递的变量地址的大小或类型,所以当你传递char的第一个地址,并使用字符串%s
的说明符时,只有编译器知道的是传递的地址,并且必须将地址解释为字符串。因为通常printf打印所有字符并在读取\0
空指针时结束执行。而字符串基本上只是由空指针\0
结束的字符集合。
答案 5 :(得分:0)
char * my_string =“Stack”; 这意味着以下几点:
正如大多数人所说的那样,加上一个观察: 如果用其他任何东西覆盖普通字符串的'\ 0'地址,它将继续打印,直到遇到'\ 0'(一种诱发网络攻击的技术)。