In for循环更新语句在ansi c++中的指针赋值有问题

ffx8fchx  于 2023-06-21  发布在  其他
关注(0)|答案(2)|浏览(81)

在更新部分中分配指针会创建Segmentation错误。为什么?

int vars[5] = {0,1,2,3,4};

int* var = NULL;
for(int i = 0; i < sizeof(vars); i++, var = &vars[i]){
    printf("%d \n", *var);
}

我希望var有实际值。

qzlgjiam

qzlgjiam1#

for循环有一个初始化表达式、一个条件和一个增量。在循环第一次运行后运行增量。在这种情况下:

for(int i = 0; i < sizeof(vars); i++, var = &vars[i]){

var仅在循环运行第一次之后被分配给非空值,此时printf("%f \n", *var);导致空解引用(未定义的行为,在本例中为分段错误)。除此之外,sizeof()返回数组中的字节数,而不是元素数。这也会导致越界访问,因为循环终止的时间比它应该终止的时间要晚得多,假设是sizeof(int) > 1
尝试将var = &vars[i]放入条件语句中,该语句在第一次迭代之前运行,而不是在increase语句中,该语句在之后运行**,然后用sizeof(vars)除以sizeof(*vars)得到数组中的元素数,而不是字节数。

int vars[5] = {0,1,2,3,4};

int* var;
for(int i = 0; var = &vars[i], i < sizeof(vars)/sizeof(*vars); i++){
    printf("%d \n", *var);
}
nwwlzxa7

nwwlzxa72#

我想我至少有一些理解。主要的问题是for括号内var的作用域与for括号外的作用域是不同的。也许它可以与lambda相比,因为它可以捕获变量。
以下代码作为intent工作:

double vars[5] = {0,1,2,3,4};
int var_size = sizeof(vars)/sizeof(vars[0]);

double* var = NULL;
int i = 0;
for(var = &vars[0]; i < var_size; var = &vars[++i]){
    printf("%f \n", *var);
}

相关问题