我正在学习C并正在玩下面的例子。
我不完全理解为什么会这样。
typedef struct
{
char even;
int length;
} Square;
Square* square;
void make_square(void) {
Square s;
s.even = 1;
s.length = 10;
square = &s;
}
void print_square(void) {
printf("even: %u\n", square->even);
printf("size: %i\n", square->length);
}
int main() {
make_square();
print_square();
}
我会假设这段代码不正确,因为我们有一行square=&s
,它将我们的全局指针square
设置为指向仅存在于函数make_square
中的对象。
所以理论上我认为正确的做法是*square = s
。但这给了我一个错误。
我想知道为什么后者给我一个seg错误,如果张贴的方式(上面的代码)也是正确的,或者只是偶然发生。
已解决 没有足够的代表来接受正确答案
我首先忘记了堆上的malloc空间。因此,当我按照我认为应该工作的方式尝试时,我遇到了一个段错误。
答案 0 :(得分:2)
欢迎来到C的危险。它并没有真正起作用;你有一个指向堆栈上的正方形的指针。从现在开始会发生什么事情会导致问题!如果您尝试更改对象,则可能会损坏堆栈中的变量。你想要做的是malloc
一个正方形并返回它 - 但是你有责任以后释放它。
答案 1 :(得分:0)
您必须将Square s;
定义更改为static Square s;
,一切都会好的。在你的情况下它是副作用 - 在某些情况下它可能不起作用,在其他情况下它似乎工作。通常,如果您使用全局变量square
(这不是一个好主意),为什么它是指向结构的指针而不是结构的真实对象?
答案 2 :(得分:-2)
*square = s;
具有square
,那么 NULL
就不好了,CREATE TABLE mypolys (polyid INTEGER, g GEOMETRY);
是全局变量的默认值,未明确初始化。