这是我今天的第二个问题,指针让我做恶梦。 我正在尝试创建一个与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);
}
提前致谢。
答案 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指针错误。