2012-10-11 22 views
2

我想分配一个char*char*,如果我使用strcpy我得到几个运行时间内存问题,所以我通过使用= operator简单分配来解决它。 任何人都可以解释在使用strcpy之前应该准备的内容以避免内存问题。我怎样才能安全地使用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 
     ... 
+1

http://stackoverflow.com/questions/1258550/why-should-you-use-strncpy-instead-of-strcpy –

+0

您是否预先在目标char *中预留了必要的空间?根据参考(http://www.cplusplus.com/reference/clibrary/cstring/strcpy/): “为避免溢出,目标指向的数组大小应足够长以包含与源相同的C字符串(包括终止的空字符),并且不应该在内存中与源重叠。“ – dunadar

+1

由于技术上的困难,我们暂时无法阅读您的想法。请显示代码。 – Rost

回答

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的基本要求是目标指针必须指向一个内存区域,该区域有足够的空间存放源指针指向的字符串。可能你的“运行时间记忆问题”是因为你没有确定,这就是为什么你需要阅读一本书。

+0

谢谢你的解释,分配指针和strcpy之间的区别对我来说很明显,但我的问题是关于使用strcpy的问题,以及我怎样才能使其无效:) – Oumaya

+0

@oumaya:它是无法确切地说明您所显示的有限代码中的问题。但最终的答案就是我所说的,你必须从*某处*获得足够的空间。有多种方法可以做到这一点。 –

+0

是的,我的观点是递归调用它的目录树中的每个文件的函数为它的子目录,所以我认为和你提到它是关于有一个有效的指针和足够的内存空间:) – Oumaya

3

简短的回答:你不应该使用strcpy所有,而是strncpy。后者的功能是而不是依赖尾随\0,并要求您提供复制的最大长度。

此外,对于指针分配,您根本不需要strncpy。你想拷贝的内存还是干脆重新指定指针?对于重新分配,=运营商是完全正常的。

+0

也许是一个有用的评论,但根本不是一个正确的答案。当你应该使用指针赋值而不是任何库函数时,它没有任何回应。 – hvd

+0

是的,我只是想澄清这一点。 – Gnosophilon

+0

我完全+1这个,但@Gnosophilon,在简单地分配一个char *到另一个char *时,在什么时候strncpy *不需要*需要?=)在我的世界里,从来没有=) – WhozCraig

2

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

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

(并做一些错误检查,如果malloc成功等)。

虽然,考虑到您的问题被标记为c++,但我建议您使用std::string班,并同时进行一些阅读。它真的有助于理解事情的实际工作。

1

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

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