初始化C结构数组,编译时大小未知

初始化C结构数组,编译时大小未知,c,pointers,struct,initialization,memset,C,Pointers,Struct,Initialization,Memset,我没有找到这个问题的确切答案,所以这不是一个愚蠢的问题,就是显而易见的问题。我想知道它是否会产生未定义的行为 我定义了一些结构类型: typedef struct { char string1[17]; char string2[33]; int someInt; float someFloat; } my_struct_t; 我需要该结构的多个实例(就像在struct数组中一样),但在编译时对象的数量是未知的 这样初始化是否正确 my_struct_t *

我没有找到这个问题的确切答案,所以这不是一个愚蠢的问题,就是显而易见的问题。我想知道它是否会产生未定义的行为

我定义了一些结构类型:

typedef struct {
    char string1[17];
    char string2[33];
    int   someInt;
    float someFloat;
} my_struct_t;
我需要该结构的多个实例(就像在struct数组中一样),但在编译时对象的数量是未知的

这样初始化是否正确

my_struct_t *myStruct;
size_t noOfElements;
size_t completeSize;
int index;    

/* ...code which sets the number of elements at runtime... */

completeSize = sizeof(my_struct_t) * noOfElements;

myStruct = malloc(completeSize);
memset(myStruct, 0, completeSize);

/* ...and then access it as if it were an array...*/

myStruct[index].someInt = 10; // index < noOfElements
我的结构*myStruct;
尺寸和无毡;
尺寸不完整;
整数指数;
/*…设置运行时元素数的代码*/
completeSize=sizeof(my_struct)*noOfElements;
myStruct=malloc(completeSize);
memset(myStruct,0,completeSize);
/*…然后像访问数组一样访问它*/
myStruct[index].someInt=10;//指数<1
这样做安全吗?我担心的是
memset()
部分

这样做安全吗?memset()部分是我担心的

是的,这是安全的,因为这不会导致任何未定义的行为(缓冲区溢出、未初始化的值等)

但是,它不一定会将您的值设置为零
memset
位设置为0,但这不一定与将
浮点值设置为
0
的值相同(尽管在实践中,在大多数正常平台上都可以)

这样做安全吗?memset()部分是我担心的

您的担心是对的-您的
memset
只是将所有位设置为零,而不一定将成员设置为0

例如,没有任何东西可以保证所有位-0对于浮点实际上意味着0。指针也是如此:将其设为全位-0并不意味着它必须为
NULL


编辑
NULL
可以表示为或不表示为all-bits-0。引用C常见问题:

空指针的内部(或运行时)表示形式,可能 或者可能不是全0位,并且对于不同的应用可能不同 指针类型


使用<代码> MalCal >遵循代码> MyStuts到目前为止是可以的,但是您可能需要考虑(使用的)<代码> CALLC/<代码>。例如:

pMyStruct = calloc(noOfElements, sizeof(my_struct_t));

这将为所需数量的元素分配内存,并将它们初始化为二进制零。

代码中的
memset
将所有位设置为0,这可能是您想要做的,也可能不是您想要做的。特别是,不能保证所有零位的指针都是空指针。也不是所有零位的浮点值都是零

如果希望代码完全可移植,那么应该初始化每个元素

my_struct_t *arr = malloc(N * sizeof arr[0]);
const my_struct_t default_my_struct = { 0 };
for (int i=0; i<N; i++)
    arr[i] = default_my_struct;
my_struct_t*arr=malloc(N*sizeof arr[0]);
const my_struct\u t default\u my_struct={0};

对于(int i=0;iNothing可以保证这一点,但C委员会也这样说:“据委员会所知,所有机器都将所有位零视为浮点零的表示形式。”@ouah Good know:-)从安全的角度来看,更好的错误是所有
0
位的指针都是空指针,它们与
null
宏比较相等,尽管它们不能具有相同类型的
null
。实际上,
0
是一个空指针常量。@Efffe不这么认为。你能提供报价吗@我想说的是,在所有平台上,将指针设置为0并不会使其为空。谢谢。因此,分配给指针的整个内存将被清零,不会出现溢出。这就足够了,但也要感谢关于整型值的警告。我会的,但我使用的平台只支持标准C库的一个子集。很遗憾,calloc()不可用。@Tomislav:奇怪,它应该在stdlib.h中。不管怎样,看起来你被malloc和memset困住了。这很奇怪。更奇怪的是,我甚至不允许包含任何ANSIC头。事实上,我甚至不能调用malloc()。相反,我调用了一个具有不同名称的函数,文档声明它充当标准的C malloc()。因此,我正在编写的代码的可移植性并不是我的首要任务
my_struct_t *arr = malloc(N * sizeof arr[0]);
for (int i=0; i<N; i++)
    arr[i] = (my_struct_t) { 0 };