初始化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 };