char数组的动态内存分配

时间:2013-08-30 15:05:52

标签: c++ c arrays dynamic-memory-allocation

我手动给出了数组大小,如下所示:

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 *));
    ...
}

6 个答案:

答案 0 :(得分:4)

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的数组,因此您需要sizeof(char),保证为1,因此您不需要乘以它

或者,如果您在兼容Posix的系统上运行,则可以简化操作并改为使用strdup

buffer = strdup(argv[1]);

最后,确保完成后free此内存

free(buffer);

答案 1 :(得分:1)

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)始终为1,因此您也可以使用:

  buffer = (char*)malloc(length+1);                       

答案 2 :(得分:1)

正确的方法是使用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样式字符串中使用的null终止符+1。

答案 3 :(得分:1)

在C ++中,您可以这样做,以便在一个不错的数据结构中获取参数。

const std::vector<std::string>(argv, argv + argc)

答案 4 :(得分:0)

首先,如果您使用C ++,我认为最好使用new而不是malloc

其次,你的malloc大小是假的:buffer = malloc(sizeof(char) * length);因为你分配了一个char缓冲区而不是char * buffer。

第三,你必须为字符串的结尾分配1个字节并存储'\ 0'。

最后,sizeof只获取类型的大小而不是字符串,必须使用strlen来获取字符串大小。

答案 5 :(得分:-1)

您需要添加一个额外的字节来保存字符串的终止空字节:

length=sizeof(argv[1]) + 1;

然后应该没问题。