2013-06-28 63 views
0

我检讨用途以下字符串赋值指定字符串为char *变量

char *str; 
str =""; 

然后编码器使用这种“STR”暂时保持像一个字符串的代码。

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

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

我知道这个工作,我想知道这个工作到底有多精确。 你怎么能声明一个char指针,并使它指向这样的字符串? 指针可以容纳的最大字符串长度是多少? 这个字符串存储在哪里?它是否自动malloc'd?

+1

最后一段代码不能编译。 –

+0

对不起。我编辑了它。感谢您指出它。 –

+0

@SteveH最后的代码从概念的角度来看非常重要,不需要抱歉和编辑。 – 0decimal0

回答

2

指针不“保持”一个字符串,它只是指向原始字符串的位置。在这种情况下,字符串文字保持为程序的一部分,指针设置为它;当您重新指定指针时,您不会创建任何副本,只需将指针设置为不同的地址即可。

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

如果你想实际制作一个字符串的副本,首先你必须为它分配一些存储空间,这个存储空间必须大于字符数。然后使用strcpy进行复制。

+0

那么这个字符串存储在内存中的位置是什么?堆? 是否会有极端的情况下,我分配一个非常长的字符串,并导致一些异常? 当我分配一个新的字符串时,原始字符串保持(假设堆)像垃圾? –

+0

@SteveH,字符串文字通常与代码本身保持在一起,而不是在堆或栈上。 –

+0

谢谢。这有帮助。 –

0

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

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

0

char *name;

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

不类似于:

炭STR [];

str =“一些字符串”; //记住这种类型的语句 将不起作用,因为str将要存储字符,但是您要分配指针的是 。

一个常量字符串总是表示一个指向该字符串的指针。

1

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

这种字符串的最大大小取决于您的编译器。

+0

明白了。谢谢。这有帮助。 –