0

我正在查看的代码使用以下字符串分配

char *str;
str ="";

然后编码器使用这个'str'来临时保存一个字符串。

str = "This is a message";
fwrite(str, 1 ,strlen(str), fp);

然后在其他地方再次使用这个 str 来分配一个具有类似用途的新字符串。

我知道这行得通,我想知道它到底是如何工作的。如何声明一个char指针并使其指向这样的字符串?这样的指针可以容纳的最大字符串长度是多少?这个字符串存储在哪里?它是自动malloc的吗?

4

4 回答 4

2

指针不会“保存”字符串,它只是指向原始字符串所在的位置。在这种情况下,字符串文字被保留为程序的一部分,并将指针设置为它;当您重新分配指针时,您不会制作任何副本,只是将指针设置为不同的地址。

因此,字符串的最大大小是字符串文字的最大大小,这取决于编译器和可用程序空间的数量。

如果要实际复制字符串,首先必须为其分配一些存储空间,该存储空间必须比字符数大一。然后用于strcpy制作副本。

于 2013-06-28T04:46:26.087 回答
1

该字符串静态包含在对象模块中。您不需要为此类字符串分配内存,因为它们已经具有编译器分配的内存。因此,您也不能释放这样的指针。如果您在 exe 文件中使用十六进制编辑器查看,您可以看到其中包含这样的字符串,而不是动态分配的字符串,只要可执行文件运行,动态分配的字符串就存在于内存中。

此类字符串的最大大小取决于您的编译器。

于 2013-06-28T04:49:38.113 回答
0

char*只是一个指向 char (或一系列)的指针。

你可以让它指向你喜欢的任何“字符串”。在给出的例子中,它们只是改变了指针的值(即指向什么str)。

于 2013-06-28T04:46:14.083 回答
0

char *name;

name="some string";//name指向字符串的位置地址。

不类似于:

字符 str[];

str="some string";// 记住这种类型的语句不会起作用,因为 str 即将存储字符但您正在分配指针。

常量字符串始终表示指向该字符串的指针。

于 2013-06-28T04:47:32.963 回答