C 使用动态成员创建全局结构

C 使用动态成员创建全局结构,c,struct,global-variables,ipc,C,Struct,Global Variables,Ipc,我有如下几点: struct t{ char arr[variable_len]; int i; }; int main(int argc, char *argv[]){ // set size of arr to length of argv[1] } 有办法做到这一点吗?我本来打算让arr成为一个指向数组的指针,并单独分配数组,但这造成了大量问题,因为我想将此结构写入管道(指针将被写入,而不是实际数组)。除了缺少错误检查之外,您可以执行以下操作 struct t

我有如下几点:

struct t{
    char arr[variable_len];
    int i;
};

int main(int argc, char *argv[]){
    // set size of arr to length of argv[1]
}

有办法做到这一点吗?我本来打算让arr成为一个指向数组的指针,并单独分配数组,但这造成了大量问题,因为我想将此结构写入管道(指针将被写入,而不是实际数组)。

除了缺少错误检查之外,您可以执行以下操作

struct t
{
    int i;
    int data_len;
    char arr[];
};

int main( int argc, char* argv[] )
{
    int data_len = atoi( argv[1] );
    struct t* var;

    var = malloc( sizeof( struct t ) + data_len );
    var->data_len = data_len;

    // open a pipe and do cool stuff to var

    fwrite( var, sizeof( struct t ) + var->data_len, 1, output_pipe );

    free( var );
}

指针将被写入而不是实际数组
?如果您可以使用
p
(指针),那么您就不能改为使用
*p
吗?@stardust\uu我可以单独编写数组(这会扼杀使用结构的意义),但是如果我要做
编写(pfd,some\u struct,sizeof(some\u struct))
我无法获得结构中成员指向的实际数组。在设计涉及将原始结构写入管道(或文件或网络套接字)的IPC协议之前,您应该三思而后行,因为您需要依赖结构的精确字节布局。不同的编译器(或使用不同选项调用的同一编译器)可能会对结构中所需的填充量做出不同的选择。例如,在上面的示例中,如果
arr[]
的长度为10字节,那么
i
之前是否会有填充?多少钱?一个
int
到底有多大?可以通过向结构中添加一个元素来解决这个问题,该元素将保存数组大小的值。这应该足以满足您的所有需求。这将是一个更合适的选择implmentation@stardust_我不知道你的意思。类似于
struct{inti;char-arr[i]}
然后设置i一旦我知道数组msut要多长时间?编辑原始答案,以说明将整个结构作为连续块写入管道(我第一次读取时错过了)这是我最初处理问题的方式,但我将结构写入管道,使用char*需要两次写入(一个用于结构,一个用于结构所指向的数组),这击败了此应用程序的结构点。请参阅我的编辑--我意识到在我的第一个答案之后,我对它进行了修改,以满足该要求,这是“洁食”c?这不要求char-arr总是最后一个吗?还有,从char*arr切换到char-arr[]的原因是什么?是的……这是犹太c,它确实要求数组在结构中是最后一个。
char-arr[]
(没有数组大小)的原因是将数组标识为可变长度数组。“大小”结构的大小是除了数组本身之外的所有元素的大小(对于
sizeof()
调用而言,它是0)…这就是malloc工作的原因…除了数组之外的所有元素的大小加上数组的大小。因此,
char arr[]
是长度不确定的字符数组,而
char*arr
是指向字符的指针。