由于我是C ++的新手,所以我编写了一个函数来返回C ++中的IP地址,所以我想精通我的代码。我知道创建一个新变量需要new
,而我们需要delete
。
我不知道为什么char *hostbuffer = new char[1024]();
与char hostbuffer[1024]={0}
不同,他们俩都创建了一个大小为1024的int数组,对吗?
std::string ipfunction_Client(){
char *hostbuffer = new char[1024]();---This cannot work
//char hostbuffer[1024]={0};---This can work
char *IPbuffer=new char[1024];
struct hostent *host_entry;
gethostname(hostbuffer,sizeof(hostbuffer));
host_entry=gethostbyname(hostbuffer);
IPbuffer = inet_ntoa(*((struct in_addr*)host_entry->h_addr_list[0]));-----This is client.cpp 230
//delete(hostbuffer);
return std::string(IPbuffer);
}
如果使用上面的代码,则valgrind的反馈是这样的:
Process terminating with default action of signal 11 (SIGSEGV): dumping core
==19697== Access not within mapped region at address 0x18
==19697== at 0x406624: ipfunction_Client() (client.cpp:230)
答案 0 :(得分:4)
使用时
char *hostbuffer = new char[1024]();
sizeof(hostbuffer)
的计算结果是指针的大小,而不是数组的大小。
使用时
char hostbuffer[1024]={0};
sizeof(hostbuffer)
的计算结果为数组的大小。
通话
gethostname(hostbuffer,sizeof(hostbuffer));
将根据您使用的声明而有所不同。
这是您代码中最重要的区别。
如果您使用
const int BUFFER_SIZE = 1024;
char *hostbuffer = new char[BUFFER_SIZE]();
...
gethostname(hostbuffer, BUFFER_SIZE);
您应该不会在行为上看到任何差异。