程序崩溃,指针试图使strcpy像

时间:2010-02-12 19:47:03

标签: c++ pointers crash strcpy

这是我今天的第二个问题,指针让我做恶梦。 我正在尝试创建一个与strcpy()函数做同样事情的程序。 一旦我尝试它..崩溃,我100%肯定这是我的代码中的指针问题。我认为因为有某种未经预知的指针(*复制)..但我已经为它指定了NULL ...所以任何人都可以告诉我Null赋值究竟是什么?因为我认为我误解了它的用法。并告诉我,可以对程序进行哪些更正以便正常运行。

 #include <iostream>
 using namespace std;

 void mycpy(char *b , char *a);

 int main()
 {

    char *original = "this is a text" ;
    char *copied = 0 ;

    mycpy(copied , original);

    for(int i = 0 ; *(copied+i) ;i++) cout << *(copied+i) ;

    return 0;
}

void mycpy(char *b , char *a){

    for(int i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i);

}

提前致谢。

5 个答案:

答案 0 :(得分:4)

嗯,您的mycpy几乎是正确的(虽然您可以使用括号而不是算术,即a[i]而不是*(a+1))。为了正确打印复制的字符串,最后一个字符必须为零,但最后一个字符是由您的函数复制。所以它应该像

void mycpy(char *b , char *a)
{
    int i;
    for(i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i);
    *(b+i) = 0; // or "\0", doesn't matter    
}

此外还有变量

char *copied = 0 ;

没有指向有效的内存,所以你从内存位置0读取这是非法的。您可以将变量定义为数组

char copied[20];

答案 1 :(得分:3)

您必须为复制操作的结果分配一些内存。

在您的情况下copied尚未初始化,因此您尝试写入空指针。以下内容将为您分配足够的内存,以便将original复制到copied

char* copied = new char[strlen(original)+1];

答案 2 :(得分:1)

你有指针,但他们没有指向任何记忆。你需要为此分配一些内存才能工作。

char *original;

这只是一个指向char类型内存的指针。你不能将它设置为“这是一个文本”,因为它只是一个指针。它没有任何空间来存储“这是一个文本”。

char original[ 15 ] = "this is a text";
char copied[ 15 ] = "this is a text";

可以使用,或

char *original;
char * copied;

original = malloc( 15 );
copied = malloc( 15 );

mycpy( original, "this is a text" );
mycpy( copied, original );

这两种方法都可以抓取15个字节来存储文本。第一个示例使用堆栈中的15个字节。第二个示例使用堆中的15个字节。

答案 3 :(得分:1)

修正:

 #include <iostream>
 using namespace std;

 void mycpy(char *b , char *a);

 int main()
 {

    char *original = "this is a text" ;
    char copied[30]; // you need to actualy allocate space 
    // (this is on stack, you could use new as well, for heap allocation)

    mycpy(copied , original);

    for(int i = 0 ; *(copied+i) ;i++) cout << *(copied+i) ;

    return 0;
}

void mycpy(char *b , char *a){
    int i =0;
    while (*(a+i)) {
        *(b+i) = *(a+i);
        ++i;
    }
    *(b+i) = '\0'; // null termination
}

答案 4 :(得分:0)

在这一行:

for(int i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i);

导致错误的b+i解除引用。您正在取消引用0(NULL),这是数字1指针错误。