0

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

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

6 回答 6

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 *)计算字符串所需的存储空间时不正确。AC 字符串是chars 的数组,所以你需要sizeof(char),它保证为 1,所以你不需要乘以它

或者,如果您在与 Posix 兼容的系统上运行,则可以简化事情并改用strdup

buffer = strdup(argv[1]);

最后,free当你完成它时,一定要记住它

free(buffer);
于 2013-08-30T15:08:20.387 回答
1

在 C++ 中,您可以这样做以使您的论点具有良好的数据结构。

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

于 2013-08-30T15:14:57.920 回答
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 样式字符串中使用的空终止符 +1。

于 2013-08-30T15:09:44.533 回答
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)总是一个,你也可以使用这个:

  buffer = (char*)malloc(length+1);                       
于 2013-08-30T15:08:38.183 回答
0

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

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

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

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

于 2013-08-30T15:11:13.603 回答
-1

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

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

然后应该没问题。

于 2013-08-30T15:08:06.470 回答