与指针试图让strcpy的样程序崩溃
题
这是我的今天,指针给我做恶梦第二个问题。 我试图做一个程序,做同样的事情,的strcpy()函数来完成.. 一旦我尝试it..it崩溃,我100%肯定这是在我的代码指针的问题。我想是因为有某种的unintiallized指针(*复印)..但我已经指派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);
}
预先感谢。
解决方案
好了,你的mycpy
差不多吧(虽然你可能已经使用了括号,而不是算术,即a[i]
而不是*(a+1)
)。为了正确打印复制串,最后一个字符必须是0,但最后一个是的不的通过你的函数复制。因此,它应该而像
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];
其他提示
您必须分配一些存储器的复制操作的结果。
在你的情况copied
尚未初始化,所以你试图写一个空指针。下面将分配足够的内存,供您复制original
成copied
char* copied = new char[strlen(original)+1];
您有一个指针,但他们没有指向任何内存。您需要分配一些内存为这个工作。
char *original;
这仅仅是一个指针,指向一些存储器是字符类型。因为它只是一个指针不能设置为“这是一个文本”。它不具有任何的空间来存储“这是一个文本”。
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个字节从所述堆。
修正:
#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
}
在此行:
for(int i = 0 ; *(a+i) ; i++) *(b+i) = *(a+i);
它b+i
的导致该错误的解除引用。你解除引用0
(NULL),它是数字1指针误差。
不隶属于 StackOverflow