我怎样才能安全地使用strcpy

时间:2012-10-11 13:08:08

标签: c++ memory-management char strcpy

我想将char*分配给char*,如果我使用strcpy我会遇到几个运行时内存问题,所以我使用= operator进行简单分配来修复它。 任何人都可以解释在使用strcpy之前应该准备什么以避免内存问题。

编辑:

int Function(const char* K,char* FileIN,char* FileOut,int DC)
{   
    char *fic_in,*n_fic,*fic_out,*fic_dec;

    unsigned char k[17];

        fic_in = (char*)malloc(60*sizeof(char));

        strcpy((char*)k,K);

        //strcpy(fic_in,FileIN);  //I remove this one
        fic_in=FileIN;            //and replace it by this
      ...

4 个答案:

答案 0 :(得分:4)

const char *a = "string literal";
const char *b;

a是一个指向字符串文字的指针。 b是一个指针,不指向任何特定的位置(它未初始化)。

b = a;

b现在指向a指向的相同内存。

char c[100];

c现在是一个包含100个字符的数组。到目前为止,记忆区域与其他所有区域完全分开。

strcpy(c, a);

c的内容(具体来说,前15个字节)现在与a指向的内存保持相同的值。所以现在有两个内存区域包含相同的字符串数据。

正如您所看到的,分配指针与strcpy几乎没有任何共同之处。如果您想将char*分配给char*,那么您不应该在strcpy附近。

阅读有关C ++的书籍至关重要,但strcpy的基本要求是目标指针必须指向内存区域,并为源指针指向的字符串留出足够的空间。可能你的“运行时内存问题”是因为你没有确保这一点,这就是你需要阅读一本书的原因。

答案 1 :(得分:3)

简短回答:您根本不应该使用strcpy,而是strncpy。后一个函数依赖尾随\0,并要求您提供最大复制长度。

此外,对于指针赋值,您根本不需要strncpy。你想复制内存还是只是重新分配指针?对于重新分配,=运营商完全没问题。

答案 2 :(得分:2)

char*是指向字符串字符的指针。要制作副本,您需要先为其分配内存并运行副本。像

这样的东西
size_t l = strlen(src);
char *dst = malloc(l+1);
memmove(dst,src,l+1);

(如果malloc成功则执行一些错误检查等)。

虽然考虑到您的问题被标记为c++,但我建议您使用std::string课程并同时进行阅读。理解事物的实际运作方式确实很有帮助。

答案 3 :(得分:1)

您需要确保接收缓冲区足够大以适应源字符串,包括末尾的终止'\0'字符。真的是这样。

如果您可以将字符串表示为可以复制的char *指针,那么这很棒,但并不总是可行。