以下是代码:
char* a[] = {"ls", "-l", "|", "grep", "test"};
int pipe_idx = 2;
char** ptr2 = a + (pipe_idx * sizeof(char**));
printf("%s\n", *ptr2);
基本上,这只是一个演示代码。该程序获取pipe_index(在这种情况下它是2
)并跳转到正确的位置,然后打印它。
为什么我会出现分段错误?
答案 0 :(得分:3)
ptr2
指的是不属于你的记忆。现在,它指向a + 8
,因为sizeof(char**)
是指针的大小,而不是char
本身。所以大小超过了你的数组大小。它是UB,这就是为什么你会遇到段错误。
如果你试图使用char指针遍历数组,你不需要像你一样进行乘法运算,你只需要将pipe_idx添加到指针,它将为你做所需的算术运算。 你需要,
char** ptr2 = a + pipe_idx
答案 1 :(得分:2)
你应该这样做:
char** ptr2 = &a[pipe_idx];
指向索引(char *
)并获取地址(char **
)。
甚至:
char** ptr2 = a + pipe_idx;
指针上的 +
为magic。你通过相乘来实际超越你的界限。