我想将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
...
答案 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 *
指针,那么这很棒,但并不总是可行。