2013-03-15 142 views
0

在我的书中有一个示例如何复制一个字符串(2个指针)。我复制了整个代码,但是当我在终端中启动程序时,它说“分段错误(核心转储)”>。 <我的C++代码有什么问题?

这段代码有什么问题? :

#include <iostream> 
#include <string> 

using namespace std; 


void cpy(char* p,const char* q){ 

    while(*p++ = *q++) ; 
} 

int main(){ 

    char* hello; 

    cpy(hello, "Whazzap"); 

    return 0; 
} 
+2

你应该去读一本好的C++书籍,这会让你开始。 http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – inf 2013-03-15 18:14:25

+1

你在用什么书? – Beta 2013-03-15 18:15:00

+0

@bamboon我想我正在用一本非常好的书 - Bjarne Stroustrup(C++的创建者)的“C++编程语言” – 2013-03-15 18:17:37

回答

4

你的指针hello未初始化。这意味着它指向一些随机存储器位置,您试图在cpy函数中写入该位置。你基本上写信给你不允许的地点。

您需要通过创建char数组来分配副本空间,但必须确保有足够的空间来复制整个字符串。

因为看起来你在学习,所以我会指出这种方法充满了危险:无论你做什么,你都必须确保你不会超出你创建的存储空间。请放心,C++标准库提供了有用的类来安全地处理这类问题,所以这应该只是学习过程的一部分,而不是你在现实生活中编程的东西。

+0

大声笑,傻我... – 2013-03-15 18:18:47

4

你的程序有未定义行为,因为你使用的是未初始化的变量的值(hello指针在这种情况下)。

您可能的意思是hello是一个字符数组。如果是的话,声明这样说:

char hello[SIZE]; 

SIZE是一个编译时间常数足够大,以确保阵列将能够容纳所有要复制到其中的角色。如果你的目标只是初始化字符串常量数组,你可以简单地这样做:

char hello[] = "Whazzap"; 
+2

在所有方面,你真的认为这个答案将有助于OP吗? – inf 2013-03-15 18:15:05

+1

@bamboon:是的。它告诉他他的麻烦来源是什么,而且是以一种普遍的方式,这将有希望在未来将他从类似的问题中解救出来。 – 2013-03-15 18:16:45

+0

@bamboon Andy的回答有什么不对? – 2013-03-15 18:47:54