C ++ char a [20] = {0}和char * a = new char [20]()有什么区别

时间:2019-10-02 16:58:08

标签: c++

由于我是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)

1 个答案:

答案 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);

您应该不会在行为上看到任何差异。