尝试从2D数组中的字符串中获取字符时出现分段错误

时间:2015-10-23 11:24:30

标签: c arrays string

我试图从2D数组中的字符串中获取字符。我目前有这个代码:

Board setData(Board b, char c, int i, int j) {
  printf("setData called\n char = %c, i = %d, j = %d\n", c, i, j);
  int index = getCharIndex(c);
  printf("Index is %d\n", index);
  char* data = b.cells[i][j];
  printf("Pre-Data = %s\n", data);
  printf("data[index] = %c\n", data[index]); // <---
  data[index] = c;
  printf("Post-Data = %s\n", data);
  b.cells[i][j] = data;
  printf("setData complete!\n");
  return b;
}

其中Board是typedef结构。所有打印都显示预期的值。但是,执行标记行时会发生分段错误。我们从前一行了解到数据&#39;是一个字符串,那么为什么当尝试从字符串中找到一个字符时它会失败?这不是因为索引的值超出了字符串的范围,当索引为0时,当字符串由多个字符组成时,它会失败。非常感谢任何帮助。

修改 MCVE:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

typedef struct {
    char *cells[10][10];
} Board;

Board newBoard() {
  Board board;
  for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
      board.cells[i][j] = "----";
    }
  }
  return board;
}

Board setData(Board b, int index, char c, int i, int j) {
  printf("setData:\nindex = %d\nchar = %c\ni = %d\nj = %d\n", index, c, i, j);
  char* data = b.cells[i][j];
  printf("data = %s\nSetting data[%d] to %c\n", data, index, c);
  data[index] = c;
  printf("Assigning data back to b.cells[%d][%d]", i, j);
  b.cells[i][j] = data;
  return b;
}

int main(int argc, char *argv[argc]) {
  Board b = newBoard();

  int index = atoi(argv[1]);
  char c = argv[2][0];
  int i = atoi(argv[3]);
  int j = atoi(argv[4]);

  setData(b, index, c, i, j);

}

给出输出:

setData:
index = 0
char = A
i = 2
j = 2
data = ----
Setting data[0] to A
Segmentation fault

期望的结果是&#39; - &#39;在指定i的单元格数组中的字符串中,j在索引位置更改为给定字符。

1 个答案:

答案 0 :(得分:1)

问题是作为字符串文字的"----"很可能位于只读(写保护)内存块中。如果您要修改其内容,请使用例如strdup("----")代替,不要忘记在某个时候释放记忆。