指向结构与实际对象的指针

时间:2015-12-27 00:36:50

标签: c struct

我正在学习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空间。因此,当我按照我认为应该工作的方式尝试时,我遇到了一个段错误。

3 个答案:

答案 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); 是全局变量的默认值,未明确初始化。