2012-07-23 62 views
3

声明后可以初始化字符串吗?声明后可以初始化字符串吗?

char *s; 
s = "test"; 

代替

char *s = "test"; 
+0

你需要在第一种情况下分配字符串所需的内存。它在第二秒自动完成。 – OmnipotentEntity 2012-07-23 14:02:08

+0

@OmnipotentEntity:nope,在这两种情况下's'指向静态分配的只读字符串。 – 2012-07-23 14:03:26

+0

更好,你应该试试这个... – 2012-07-23 14:04:06

回答

4

可以,但请记住,你在s的指针被存储在其他地方分配的只读字符串的语句。任何修改它的尝试都会导致未定义的行为(即在某些编译器上它可能会工作,但通常只会崩溃)。这就是为什么通常你使用const char *的事情。

+0

是堆栈上的“测试”字符串文字? – 2012-07-23 14:08:35

+0

两者有什么区别? – user1301568 2012-07-23 14:09:38

+0

@Nandkumar:不,它的分配像一个全球性的。 – 2012-07-23 14:13:44

1

是的,你可以。

#include <stdio.h> 

int 
main(void) 
{ 
    // `s' is a pointer to `const char' because `s' may point to a string which 
    // is in read-only memory. 
    char const *s; 
    s = "hello"; 
    puts(s); 
    return 0; 
} 

注意:它不适用于数组。

#include <stdio.h> 

int 
main(void) 
{ 
    char s[32]; 
    s = "hello"; // Syntax error. 
    puts(s); 
    return 0; 
} 
1

这是一个正确的指针(如上所述),因为里面引号括起来的是从在编译时,编译器分配的,所以您可以指向该内存地址。当你尝试改变它的内容或者当你想要指向那个固定大小的数组时,问题就出现了