strcpy抛出内存异常

时间:2011-06-17 06:16:23

标签: c++

#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;
}

此代码存储内存异常。为什么?

8 个答案:

答案 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)

您的代码有些“错误”。

  1. 使用:

    #include <iostream>
    
  2. 您没有使用C ++字符串。

    std::string a = "hello";
    std::string b = a;
    

  3. 如果您坚持使用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;
}