2014-05-05 124 views
0

我是学习C语言的新手,我对指针有个疑问。在char *指针上尝试strcpy时出现C分割错误

例如,如果我试试这个:

char *pointer; 
strcpy(pointer,"Hello, World!\n"); 
printf(pointer); 

我得到这样的输出:

Segmentation Fault 

但如果我试试这个:

char *pointer = "Hello, World!\n"); 
printf(pointer); 

我得到这个:

Hello, World! 

我的问题是为什么它不与strcpy一起使用。 这些功能在整体上是一样的。

第一个源代码和第二个源代码有什么不同?

如果有人能够解释记忆中发生了什么,这将是一件好事,以便我能更好地了解这一点。

+0

http://meta.stackexchange.com/a/129632/165773 – gnat

回答

6

char* pointer仅仅给你一个变量以用于访问的存储器位置。你还没有分配任何内存,所以当你做strcpy时,你正在写任何随机/未定义的值pointer

你需要做的是这样的:

char* pointer = calloc(LEN); 
if (pointer) 
{ 
    strcpy(pointer, "Hello World"); 
    printf(pointer); 
    free(pointer); 
} 
+1

使用'函数strncpy()'会更安全。 – Blrfl

+0

啊,好的。所以我们可以说我有 '字符* pointer' 然后指针在我的记忆中ADRESS是例如0xBFFFF800 但在这个ADRESS是一个随机值,然后指针指向保存在0xBFFFF800右侧的任意位置? – josepchappa

+0

@ user3605865是的,下一个字节可能是任何东西。它可能是你的操作系统的关闭钩子,它可能是启动全局热核战争的控制代码(如果它是一台运行该类软件的计算机)......这就是为什么你应该总是分配内存,以防止尝试写入(或读出)你不应该访问的内存。 – jwenting

1

“strcpy”的第一个参数应指向内存中的可用位置。在你的第一个源代码中,你还没有初始化任何东西的“指针”。应先通过声明它是最大长度的字符数组初始化它,例如:

char myArray[42]; // where 42 represents the maximum capacity 
+0

好点 - 修正 – jordan