1

这是我今天的第二个问题,指针让我做噩梦。我正在尝试制作一个与 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);

}

提前致谢 。

4

5 回答 5

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];
于 2010-02-12T19:51:18.187 回答
3

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

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

char* copied = new char[strlen(original)+1];
于 2010-02-12T19:50:01.137 回答
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 个字节。

于 2010-02-12T19:49:31.733 回答
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
}
于 2010-02-12T19:59:38.737 回答
0

在这一行:

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

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

于 2010-02-12T19:53:45.533 回答