2012-08-25 69 views
1

可能重复:
What is the difference between char s[] and char *s in C?
Question about pointers and strings in Cchar * str =“...”和char str [N] =“...”之间的区别?

我阅读在C字符串和我很困惑。我可以用两种方法“声明”字符串:

char *str = "This is string"; 
char str2[20] = "This is string"; 

这两个声明之间有什么区别? char str2[20]何时会优于char *str

+2

http://c-faq.com/decl/strlitinit.html – cnicutar

+0

http://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/ – amitchhajer

+0

阅读[差异在'char * str'和'char str []'之间以及如何在内存中存储?](http://stackoverflow.com/questions/15177420/what-does-sizeofarray-return/15177499#15177499) –

回答

1
char *str = "This is string"; 

放入的数据不能被修改的program.This的constant data section (also known as .rdata)的字符串。

char str2[20] = "This is string"; 

在这种类型的声明数据的优选方案的stored in the stack area,如果宣布function scope内部和data section如果在global scope。这数据声明可以被修改。

因此,如果您有修改数据的必要性,那么请使用第二种方法。

+0

你能解释我说'char * str =“..”'是运行时分配吗?我认为你误解我的答案(错误或故意)。 – Joe

2

在C中,字符串表示为char s的序列,带有NULL字符(又名0,'\0')。它们存储在内存中,并使用引用它的方式工作。您已经确定了引用它的两种方式,一种是char *,它是指向chars序列的指针和一个数组,它是作为实际变量的直接字符串。请注意,字符串“abc”长度为字节,因为还有一个额外的NULL字符来表示字符串的结尾。

除此之外,您实际上在示例中分配了字符串,这也涉及在编译时给出的字符串。

所以有两个问题。首先是关于如何表示字符串(char * vs char[]),其次是关于编译时字符串。

来到你的例子:

一个建立在程序的文本和它的指针常量字符串。根据编译器的不同,它可以存储在任何地方。它相当于mallocing一个字符串并存储一个指向它的指针,除非你不能改变内存的内容。这是一个char *,这样就可以改变指针,以指向其他地方,例如另一malloced串或您例2

第二中所定义的阵列开始创建一个字符数组(其中表示字符串的方式)。该数组在函数的持续时间内被存储并分配到堆栈上,并且可以更改其内容。因为它不是指针,所以不能将其更改为指向不同的字符串。

+0

换句话说第一个声明创建不可变的字符串,而第二个声明是可变的? – rogi

+0

不,它*是*可以改变字符串,如果你想(你可以做几乎任何东西在C)。但你*绝不能*!它们只是创建字符串的不同方式。你应该阅读关于内存分配的更好的理解。 – Joe

+0

+万用于“你几乎可以用C做任何事情,*但是你绝对不可以!*” – Chani

0

C没有字符串。所有有char阵列。 C中的数组只是指向第一个元素的指针。

做这件事最简单的方法实际上是你的第一个变种。不指定数组常量的一个明确的长度将节省您不小心做一些像

char[3] = "abc"; 
0

C字符串在内存恒定的,所以:

char *str = "This is string"; 

店“这是串”在内存中,它不可变,你只能指定另一个地址给str。

然而

char str2[20] = "This si string"; 

char String2[20]={'T','h','i','s',' ','s','i',' ','s','t','r','i','n','g','\0'}; 

其并不在存储器中存储的字符串,存储独立字节的简写。

如果要使用常量字符串(如消息),请使用第一行。 如果你想使用和操纵字处理器中的字符串,然后使用秒。

问候

+0

“不可变”并不完全准确 – Joe

0

​​- 这将使文本段中的字符串保持为只读数据,并将地址存储在本地指针变量str中。

str[0] = 'a'; //This will leads to crash, because strings are in read only segment. 
printf("%d",sizeof(str)); //This will print 4(in 32bit m/c) or 8(in 64 bit m/c) 

char str2[20] = "This is string"; - 这会将字符串保留为本地堆栈中的字符数组。

str2[0] = 'a'; //This will change the first character to a 
printf("%d",sizeof(str2)); //This will print 20 
相关问题