1

我正在尝试查看一段代码,但有些事情让我感到困惑。

当我们使用下面的结构时:

    struct sdshdr {
        int len;
        int free;
        char buf[];
    };

我们将像这样分配内存:

    struct sdshdr *sh;
    sh = zmalloc(sizeof(struct sdshdr)+initlen+1);

那么,在 struct 中声明 buff 时char[]&之间有什么区别?char*

char[]指继续地址吗?

4

2 回答 2

4

不同的是简单char buf[]地声明了一个灵活的数组;char * buf声明一个指针。数组和指针在很多方面都不一样。例如,您将能够在初始化后直接分配给指针成员,但不能分配给数组成员(您将能够分配给整个结构)。

于 2013-09-28T04:17:01.060 回答
1
struct sdshdr {
        int len;
        int free;
        char buf[];
    };


struct shshdr *p = malloc(sizeof(struct shshdr));

       +---------+----------+-----------------+ 
p -->  | int len | int free | char[] buf 0..n |  can be expanded 
       +---------+----------+-----------------+ 

struct sdshdr {
        int len;
        int free;
        char *buf;
    };

struct shshdr *p = malloc(sizeof(struct shshdr));

       +---------+----------+-----------+ 
p -->  | int len | int free | char* buf | cannot be expanded, fixed size
       +---------+----------+-----------+ 
                                   |
                            +-----------+
                            |           | 
                            +-----------+

在第一种情况下这是有效的:

struct shshdr *p = malloc(sizeof(struct shshdr)+100); // buf is now 100 bytes
...
struct shshdr *q = malloc(sizeof(struct shshdr)+100);

memcpy( q, p, sizeof(struct shshdr) + 100 );
于 2013-09-28T06:42:25.850 回答