在更新部分中分配指针会创建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有实际值。
qzlgjiam1#
for循环有一个初始化表达式、一个条件和一个增量。在循环第一次运行后运行增量。在这种情况下:
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)得到数组中的元素数,而不是字节数。
var
printf("%f \n", *var);
sizeof()
sizeof(int) > 1
var = &vars[i]
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); }
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); }
2条答案
按热度按时间qzlgjiam1#
for
循环有一个初始化表达式、一个条件和一个增量。在循环第一次运行后运行增量。在这种情况下:var
仅在循环运行第一次之后被分配给非空值,此时printf("%f \n", *var);
导致空解引用(未定义的行为,在本例中为分段错误)。除此之外,sizeof()
返回数组中的字节数,而不是元素数。这也会导致越界访问,因为循环终止的时间比它应该终止的时间要晚得多,假设是sizeof(int) > 1
。尝试将
var = &vars[i]
放入条件语句中,该语句在第一次迭代之前运行,而不是在increase语句中,该语句在之后运行**,然后用sizeof(vars)
除以sizeof(*vars)
得到数组中的元素数,而不是字节数。nwwlzxa72#
我想我至少有一些理解。主要的问题是for括号内var的作用域与for括号外的作用域是不同的。也许它可以与lambda相比,因为它可以捕获变量。
以下代码作为intent工作: