在C语言中,正如你所说,“字符串”是一个数组char
。 C 规范中内置的大多数字符串函数都期望字符串以“NULL 终止”,这意味着最后一个字符串char
字符串的一个是0
。不是代表数字零的代码,而是实际值0
.
例如,如果您的平台使用 ASCII,则以下“字符串”是“ABC”:
char myString[4] = {65, 66, 67, 0};
当您使用char varName[] = "foo"
语法,您在堆栈上分配字符串(或者如果它在全局空间中,则您在全局分配它,但不是动态分配。)
C 语言的内存管理比您可能使用过的许多其他语言更加手动。特别是,有一个“指针”的概念。
char *myString = "ABC"; /* Points to a string somewhere in memory, the compiler puts somewhere. */
Now, a char *
是“指向 char 或 char 数组的地址”。请注意该语句中的“或”,对于程序员来说,了解情况很重要。
确保您执行的任何字符串操作不超过分配给指针的内存量也很重要。
char myString[5];
strcpy(myString, "12345"); /* copy "12345" into myString.
* On no! I've forgot space for my nul terminator and
* have overwritten some memory I don't own. */
“12345”实际上是 6 个字符长(不要忘记0
最后),但我只保留了 5 个字符。这就是所谓的“缓冲区溢出”,并且是许多严重错误的原因。
“[]”和“*”之间的另一个区别是创建一个数组(正如您所猜测的)。另一种是不保留任何空间(除了保存指针本身的空间)。这意味着,除非您将其指向您知道有效的地方,否则不应使用指针的值进行读取或写入。
还有一点(评论里有人说的)
您无法将数组作为参数传递给 C 中的函数。当您尝试时,它会自动转换为指针。这就是为什么我们传递指向字符串的指针而不是字符串本身