我正在尝试理解这段代码:
struct mys {
双d [128];};
void my_func(int iters){ int i;
struct mys * ptr = malloc(iters * sizeof(struct mys)); for(i = 0; i< iters; …
这里发生了什么: ptr[i].d[0] = (double)i; ?
ptr[i].d[0] = (double)i;
这个:
struct mys *ptr = malloc(iters *sizeof(struct mys));
为一个结构数组分配内存,称为 ptr 。
ptr
这行代码:
受让人 i 到阵列的第一个单元格 d 的 i -th struct,在数组中 ptr 。
i
d
i 被铸造成 double 因为 d 是一系列双打,和 i 被宣布为 int 。
double
int
什么时候 iters 是2,我尝试: for(int i = 0; i < iters; i++) { printf("%p\n", ptr[200].d); } 它仍然打印一个地址。这是为什么?因为它不应该超出范围 ptr 只有2个结构?
iters
for(int i = 0; i < iters; i++) { printf("%p\n", ptr[200].d); }
这肯定超出了范围,因为数组是0索引的。
但是,这种尝试会引发 未定义的行为 (UB),这意味着您不知道代码的行为方式。例如,在您的计算机中它打印一个地址,在我的计算机中它可能会导致分段错误,等等......
所以这只是将每个结构的第一个元素设置为0.我是对的吗?
它复制索引 i ,转换为类型 double ,进入每个结构的第一个元素。否则你是对的。
关于表达 ptr[200].d ,这是一样的 &(ptr[200]) 因为数组 d[] 是唯一的元素 mys 宾语。因为一个 double 是八个字节宽,每个 mys 对象占用(8字节)(128)= 1 kiB。因此, &(ptr[200]) == ptr + 200*1024 。最后一个地址是200 kiB的开头 *ptr 。地址是否有意义取决于是否存储了有意义的内容。
ptr[200].d
&(ptr[200])
d[]
mys
&(ptr[200]) == ptr + 200*1024
*ptr