在另一个函数中访问c字符串时出现分段错误

时间:2018-09-02 09:51:11

标签: c

我正在编写一个小型程序来再次熟悉C。
我现在有一部分程序卡住了,无法前进。我有一个函数,在其中创建一个c字符串和一个指向该字符串第二个元素的指针。 (完成后,它应该收到一个指向另一个字符串的指针)
当我将此字符串传递给另一个函数时,该函数应该删除第一个函数中的某些元素,但我总是遇到分段错误。这意味着我无法访问该内存。但是,如果我更改顺序,则将字符串传递给函数,则会遇到相同的错误...。

代码如下:

int analyze_sudoku(const void *self, Sudoku *sudoku) {
  for(int i = 1; i < 82; i++)
  {
    int success = 0;
    // All possible values of a column
    // This can be rewritten of course but this way
    // it makes the intention what this var is for
    // very clear in my opinion
    char options[10] = {'1','2','3','4','5','6','7','8','9'};
    char *chars_in_row;
    // The same problem...
    // chars_in_row = sudoku->get_row_for_column(sudoku, i);
    chars_in_row = &options[2];
    printf("In field %d we have this chars in the row: %s\n", i,chars_in_row);
    printf("length der chars: %d\n", strlen(chars_in_row));
    printf("addresse of the char pointers: %p\n", (void *)chars_in_row);
    // After receiving all chars from one row, we remove
    // those from the one we have in our options
    // HERE IS THE FUNCTION CALL
    remove_from_options(options, chars_in_row);
    // ... more code follows

  }
}

这是我遇到段错误的函数:

char *remove_from_options(char *options, char *already_in_use) {
  puts("Welcome");
  printf("Your options: %s\n", options);
  // HERE THE SEG FAULT HAPPENS
  // as already mentioned the error happens no matter what I give this function
  printf("pointer address: %p", (void *)already_in_use);
  printf("already in use: %s", already_in_use);
  printf("in use länge: %d", strlen(already_in_use));
for(int i = 0; i < strlen(already_in_use); i++)
  {
    // some code...
  }
}

1 个答案:

答案 0 :(得分:0)

char options[10] = {'1','2','3','4','5','6','7','8','9'};

不是字符串,而是字符数组。在C语言中,字符串实际上是一维字符数组,以空字符'\ 0'终止。

%s中的printf()格式说明符将写入直到(不包括第一个空终止符)每个字节。由于char数组option没有空字符,因此printf()的访问权限必须超出option数组的大小,这会导致分段错误。

尝试在option数组的最后添加空字符,如下所示:

char options[10] = {'1','2','3','4','5','6','7','8','9','\0'};

编辑

我完全没想到数组option的最后一个索引已经用0初始化了。无需在option数组的末尾显式给出空字符。 OP接受了此作为答案,因为这可以以某种方式解决OP的问题。因此,我无法删除此帖子。需要使用最少的完整且可验证的示例来确定OP提到的问题的根本原因。