#include<stdio.h>
#include<string.h>
#include<iostream.h>
using namespace std;
int main()
{
const char *a="hello";
char *b;
strcpy(b,a);
cout<<b;
return 0;
}
此代码存储内存异常。为什么?
答案 0 :(得分:7)
char* b
是一个尚未指向任何内存的指针......它只是一个随机地址。您尝试将a
的内容复制到该地址的内存中。相反,首先在某个内存中指向b
- 本地数组或来自new char[]
。
char buffer[128];
char* b = buffer;
char* b = new char[128];
// use b for a while...
delete[] b; // release memory when you've finished with it...
// don't read/write data through b afterwards!
(或直接将其直接复制到buffer
:-))
BTW,C ++有一个<string>
标题,它更容易使用:
#include <string>
int main()
{
std::string s = "hello";
std::string t = s;
std::cout << t << '\n'; // '\n' is a "newline"
}
如果您正在编写新代码,请选择std :: string,但迟早您还需要了解所有char*
内容,尤其是当C ++代码需要与C库交互时。 / p>
答案 1 :(得分:2)
异常是由于未初始化,
char *b;
将堆栈上的b
分配为数组,
char b[SIZE];
或使用new
及以后delete
进行分配。但最好的方法是,
std::string b;
b = a;
答案 2 :(得分:1)
b
未初始化。它是一个指针,但它不指向任何位置(它包含NULL
或垃圾值)。 strcpy
尝试写入它,但它必须有一个指向要写入的指针。您必须先将一些内存分配给b
,然后才能使用它。例如:
char *b = new char[20]; //dynamically allocate some memory
或
char b[20]; //allocate some memory on the stack
答案 3 :(得分:1)
下面
char *b;
strcpy(b,a);
b
未初始化 - 使用其值是未定义的行为。即使在你的平台上使用它的值是可以的,它仍然保存“无论”地址 - 将字符串复制到“任何地址”是未定义的行为。
您必须通过任何合法方式分配内存块,并将b
设置为该块的开始。该块必须足够大,以便将字符串与终止空字符一起保存。
答案 4 :(得分:1)
您的代码有些“错误”。
使用:
#include <iostream>
您没有使用C ++字符串。
std::string a = "hello";
std::string b = a;
如果您坚持使用strcpy()
,请为b
分配一些内存:
b = new char[strlen(a)];
// Your code here
delete[] b;
有很多记忆可供使用。不需要破坏腐败的东西。
答案 5 :(得分:0)
strcpy(dest, source)
在您的代码中,b是您的目标,并且未初始化。即使你切换它们仍然会崩溃,因为你没有为b分配内存。目标存储器必须预先分配。
答案 6 :(得分:0)
您需要为目的地分配内存(例如使用malloc
),然后才能在那里复制内容。
答案 7 :(得分:0)
程序运行时,char指针b初始化为0。所以你不能复制任何东西。
如果要复制C ++样式的字符串,请改为:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string a = "hello";
string b = a;
cout << b << endl;
return 0;
}