char数组的动态内存分配
Posted
技术标签:
【中文标题】char数组的动态内存分配【英文标题】:Dynamic memory allocation to char array 【发布时间】:2013-08-30 15:05:52 【问题描述】:我已经手动给出了数组大小,如下所示:
int main(int argc, char *argv[] )
char buffer[1024];
strcpy(buffer,argv[1]);
...
但是如果参数中传递的数据超过这个大小,它可能会产生问题。
这是动态分配内存的正确方法吗?
int main(int argc, char *argv[] )
int length;
char *buffer;
length = sizeof(argv[1]); //or strlen(argv[1])?
buffer = (char*)malloc(length*sizeof(char *));
...
【问题讨论】:
您使用 C 还是 C++ 工作?如果您使用 C++ 工作,使用malloc()
通常会被误导(并且原始的 char *
也不是一个好主意)。如果您使用 C 语言,则不需要 C++ 标签。事实上,不要对问题进行双重标记——它们是两种不同的语言。
关于您的问题“使用sizeof()
或strlen()
”,使用strlen(argv[1])+1
将按您的意愿工作(并且使用sizeof
通常不会分配足够的内存)。更大的问题,为什么需要argv[1]
指向的数据的副本?
【参考方案1】:
sizeof
告诉你char*
的大小。你想要strlen
而不是
if (argc < 2)
printf("Error - insufficient arguments\n");
return 1;
length=strlen(argv[1]);
buffer = (char*)malloc(length+1); // cast required for C++ only
我在这里提出了一些其他更改
您需要为空终止符在buffer
添加一个额外的字节
您应该检查用户是否传入了argv[1]
sizeof(char *)
在计算字符串所需的存储空间时不正确。 C字符串是char
s的数组,所以需要sizeof(char)
,保证为1,所以不需要乘以它
或者,如果您在与 Posix 兼容的系统上运行,您可以简化操作并改用 strdup:
buffer = strdup(argv[1]);
最后,当你完成它时,一定要free
这个内存
free(buffer);
【讨论】:
【参考方案2】:正确的方法是使用std::string
,让C++为你完成工作
#include <string>
int main()
std::string buffer = argv[1];
但如果你想以艰难的方式做到这一点,那么这是正确的
int main()
int length = strlen(argv[1]);
char* buffer = (char*)malloc(length + 1);
不要忘记为 C 样式字符串中使用的空终止符 +1。
【讨论】:
【参考方案3】:在 C++ 中,您可以这样做以使您的论点具有良好的数据结构。
const std::vector<std::string>(argv, argv + argc)
【讨论】:
【参考方案4】:length= strlen(argv[1]) //not sizeof(argv[1]);
和
//extra byte of space is to store Null character.
buffer = (char*)malloc((length+1) * sizeof(char));
由于sizeof(char)
总是一,你也可以使用这个:
buffer = (char*)malloc(length+1);
【讨论】:
如果 C: 不需要 malloc 的强制转换,sizeof(char)
也是多余的,因为它是 1
。
@pzaenger 是的,同意,以一般方式编写。【参考方案5】:
首先,如果您使用 C++,我认为最好使用 new
而不是 malloc
。
其次,你的 malloc 大小是错误的:buffer = malloc(sizeof(char) * length);
因为你分配的是 char 缓冲区而不是 char* 缓冲区。
第三,您必须为字符串的末尾多分配 1 个字节并存储 '\0'。
最后,sizeof 只获取类型的大小而不是字符串,必须使用 strlen 获取字符串大小。
【讨论】:
在C++中,最好不要使用new
,而是使用std::string
。
我认为这取决于你想用它做什么,如果它是用于存储一个字符串,当然 std::string 可以完成这项工作,但是对于一个不需要字符串的数组,我更喜欢自己管理。【参考方案6】:
您需要添加一个额外的字节来保存字符串的终止空字节:
length=sizeof(argv[1]) + 1;
那应该没问题。
【讨论】:
sizeof 在这种情况下不合适 @David Ellimanargv[1]
的类型是 char*
。 sizeof(char*)
告诉你指针的大小而不是它指向的字符串的长度。以上是关于char数组的动态内存分配的主要内容,如果未能解决你的问题,请参考以下文章