任何人都可以解释一下吗?
#include<stdio.h>
void FunPrinter(int *x)
{
int i, j;
for(i = 0; i < 4; i++, printf("\n"))
for(j = 0; j < 5; j++)
printf("%d\t",*x++);
}
int main()
{
int x[][5] = {
{17, 5, 87, 16, 99},
{65, 74, 58, 36, 6},
{30, 41, 50, 3, 54},
{40, 63, 65, 43, 4}
};
int i, j;
int **xptr = x;
printf("Addr:%ld,Val:%ld,ValR:%ld",(long int)x,(long int)*x,(long int)**x);
printf("\nInto Function\n");
FunPrinter(&x[0][0]);
printf("\nOut Function\n");
for(i = 0; i < 4; i++, printf("\n"))
for(j = 0; j < 5; j++)
printf("%d\t",**xptr++);
return 0;
}
输出:
Addr:140734386077088,Val:140734386077088,ValR:17
Into Function
17 5 87 16 99
65 74 58 36 6
30 41 50 3 54
40 63 65 43 4
Out Function
Segmentation fault (core dumped)
为什么直接寻址不起作用?我通过指针访问。我使用过双指针,但它不起作用。 我也尝试使用单指针作为xptr。但仍然无法正常工作。
答案 0 :(得分:1)
您遇到了分段错误,因为您正在迭代错误的指针(在最外面的维指针上)。在该维度上只有4个有效的块可以迭代(而不是20)。
这里,x
和*x
(使用%p
来打印指针,而不是转换)是相同的值,因为它们都指向数组的开头(相同的地址),但指针算术是不同的(元素的大小不同)。您可以通过x
进行迭代,可能需要将其转换为int *
。
此外,您在FunPrinter
中使用的方法 - 将2D数组降级为1D数组并不能保证能够正常工作,它确实涉及未定义的行为(尽管大多数合理的编译器都会很好地编译它)。 / p>