写入指针时出错,该指针通过将指针更改为数组来解决。发生了什么?
Error writing to a pointer that solves by changing pointer to array. What's happening?
所以我用 C 编写了一个数独解算器,我想出了一些我没想到的东西。
数独存储为指向字符的全局指针。
char *sudoku=
"200050713"
"431000805"
"675800094"
"016075000"
"740268901"
"052914037"
"527600109"
"164090382"
"080102006";
在程序的某些时候,我自然不得不写入数组,以保持简单(和合法)让我们说:
sudoku[1] = '1';
我在那条线上收到了一个 SIGSEGV。这通过将全局变量 sudoku 的类型更改为数组来解决。
char sudoku[] = ...
如果您想知道的话,没有任何其他名为 sudoku 的变量或函数。
我很好奇这种行为,全局指针是只读的吗?
I'm curious about this behaviour, is a global pointer read-only?
与全局无关。调用 char *s = "asdf"
在只读内存中创建一个数组,并将指针 s
指向它。好吧,更准确地说,它不一定是只读内存,但它可能是,而且不管它是试图写入它的未定义行为。这与这样做大致相同:
const char arr[] = "asdf";
char *s = arr;
然而,您的第二次尝试初始化了一个数组,请注意它与上面代码段中的第一行有多么相似。只需删除 const
即可得到相同的结果。
所以我用 C 编写了一个数独解算器,我想出了一些我没想到的东西。
数独存储为指向字符的全局指针。
char *sudoku=
"200050713"
"431000805"
"675800094"
"016075000"
"740268901"
"052914037"
"527600109"
"164090382"
"080102006";
在程序的某些时候,我自然不得不写入数组,以保持简单(和合法)让我们说:
sudoku[1] = '1';
我在那条线上收到了一个 SIGSEGV。这通过将全局变量 sudoku 的类型更改为数组来解决。
char sudoku[] = ...
如果您想知道的话,没有任何其他名为 sudoku 的变量或函数。 我很好奇这种行为,全局指针是只读的吗?
I'm curious about this behaviour, is a global pointer read-only?
与全局无关。调用 char *s = "asdf"
在只读内存中创建一个数组,并将指针 s
指向它。好吧,更准确地说,它不一定是只读内存,但它可能是,而且不管它是试图写入它的未定义行为。这与这样做大致相同:
const char arr[] = "asdf";
char *s = arr;
然而,您的第二次尝试初始化了一个数组,请注意它与上面代码段中的第一行有多么相似。只需删除 const
即可得到相同的结果。