2

我想分配一个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

4 回答 4

4

简短的回答:你根本不应该使用strcpy,而是strncpy. 后一个功能不依赖尾随\0,并且需要您提供最大复制长度。

此外,对于指针分配,您根本不需要strncpy。你想复制内存还是简单地重新分配指针?对于重新分配,=操作员非常好。

于 2012-10-11T13:11:09.717 回答
4
const char *a = "string literal";
const char *b;

a是指向字符串文字的指针。b是一个没有特别指向任何地方的指针(它是未初始化的)。

b = a;

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

char c[100];

c现在是 100 个字符的数组。到目前为止,该内存区域与其他所有内容完全分开。

strcpy(c, a);

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

如您所见,分配指针与strcpy. 如果您想将 a 分配char*给 a char*,那么您不应该靠近strcpy.

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

于 2012-10-11T13:12:25.637 回答
2

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

size_t l = strlen(src);
char *dst = malloc(l+1);
memmove(dst,src,l+1);

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

不过,考虑到您的问题已标记为c++,我建议您使用std::string课程并同时进行一些阅读。这真的有助于理解事情的实际运作方式。

于 2012-10-11T13:12:01.243 回答
1

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

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

于 2012-10-11T13:12:12.920 回答