我手动给出了数组大小,如下所示:
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 *));
...
}
答案 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;
然后应该没问题。