C语言memset初始化结构体数组后赋值不生效问题求解
异常根本原因
你打印数组内容时使用的索引和实际完成赋值的索引不一致:
- 赋值阶段操作的是
prob_values[prob_count](此时prob_count还未自增) - 赋值完成后先执行了
prob_count++,再调用printf打印时,访问的是prob_values[prob_count],也就是未赋值的下一个数组元素
未初始化时这块内存是随机值,memset后是全0,自然会出现赋值未生效的错觉,本身赋值逻辑是正常执行的。
修复方案
调整自增和打印的顺序即可,修改后代码示例:
int prob_count = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("%d, %d, ", prob_count, prob_values[prob_count].index); prob_values[prob_count].index = (int) prob_count; prob_values[prob_count].probability = (float) pow((1.0 - p_x_error), n - i) * pow((1.0 - p_z_error), num_data_qubits - j) * pow(p_x_error, i) * pow(p_z_error, j); prob_values[prob_count].count = (unsigned long) pascal_triangle[n][i+j]; // 先打印已赋值的元素,再自增索引 printf("At index %d: prob: %e, count: %lu\n", prob_values[prob_count].index, prob_values[prob_count].probability, prob_values[prob_count].count); prob_count++; } }
额外优化建议
- 不要用
pow(n,2)计算数组长度,pow是浮点数运算存在精度误差风险,直接写n*n即可 - 当前使用的是C可变长度数组,若n数值较大时容易出现栈溢出,建议改用
malloc动态分配数组内存更稳妥。
内容的提问来源于stack exchange,提问作者Mav
相关产品推荐
相关产品推荐

