我期待这两个下列载体在RAM相同的表示:C - “char var []”和“char * var”之间的区别?
char a_var[] = "XXX\x00";
char *p_var = "XXX";
但怪,f(char argument[])
类型的库函数crushs如果我把它用f(p_var)
运行的应用程序。但使用f(a_var)
是好的!
为什么?
我期待这两个下列载体在RAM相同的表示:C - “char var []”和“char * var”之间的区别?
char a_var[] = "XXX\x00";
char *p_var = "XXX";
但怪,f(char argument[])
类型的库函数crushs如果我把它用f(p_var)
运行的应用程序。但使用f(a_var)
是好的!
为什么?
第一个创建一个包含字符串的char数组。数组的内容可以修改。第二个创建一个指向字符串文字的字符指针。字符串文字不能修改。
推测,功能f
修改传递给它的字符串的内容。
是的,它会修改。但为什么f(p_var)使crush和f(a_var)不是? – psihodelia 2009-12-10 12:14:32
因为: char * p_var =“XXX”; 无法修改。 – 2009-12-10 12:16:04
数组可以作为指针对待(通常),但这并不意味着它们总是可以互换的。正如另一个人所说,你的p_var指向一个文字,静态的东西不能改变。它可以指向别的东西(例如,p_var = & a_var [0]),但不能更改由引号指定的原始值....
类似的问题是,当您将变量定义为数组放入一个文件中,然后将其作为指针外部使用。
问候
正如有人说,char *p_var = "XXX";
创建一个指向一个字符串文字是不能改变的,所以编译器实现可以自由地重用文本,例如:
char *p_var = "XXX";
char *other = "XXX";
编译器能选择通过在存储器中只存储一次“XXX”来优化这一点,并使两个指针指向它,修改它们的值可能会导致意外的行为,所以这就是为什么你不应该尝试修改它们的内容。
据我所知,在ANSI C中都可以修改 – psihodelia 2009-12-10 12:19:01
你知道错了。该标准禁止修改字符串文字。 – 2009-12-10 12:20:53
好的,谢谢!现在,我会永远记住它:) – psihodelia 2009-12-10 12:23:08