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字符串是chars的数组,所以需要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&lt;std::string&gt;(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 Elliman argv[1] 的类型是 char*sizeof(char*) 告诉你指针的大小而不是它指向的字符串的长度。

以上是关于char数组的动态内存分配的主要内容,如果未能解决你的问题,请参考以下文章

C语言动态分配二维字符串数组

指向动态二维字符数组的三重指针的内存分配

动态分配内存

在字符串和结构数组中查找动态内存分配错误

Windows C - 使用 MIDL 协议通过引用动态分配的 unsigned char 内存传递指针

如何在C中为char**动态分配内存