我正在编写一个小型程序来再次熟悉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...
}
}
答案 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提到的问题的根本原因。