尝试打印数组时为什么会出现分段错误?

时间:2016-05-06 19:39:37

标签: c memory segmentation-fault

以下是代码:

char* a[] = {"ls", "-l", "|", "grep", "test"};
  int pipe_idx = 2;

  char** ptr2 = a + (pipe_idx * sizeof(char**));
  printf("%s\n", *ptr2);

基本上,这只是一个演示代码。该程序获取pipe_index(在这种情况下它是2)并跳转到正确的位置,然后打印它。

为什么我会出现分段错误?

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。你通过相乘来实际超越你的界限。