1) C 中的点运算符只是一种允许您访问结构成员的语言结构。您正在使用它来访问结构的成员,所以它是完全合法的。它没有理由不工作。
在 C# 中,您也可以使用“.”。调用对象内部的函数。也就是说,如果你在 C# 中有以下类
public class foo()
{
public void print_hello()
{
Console.Writeline("Hello,World");
}
}
您可以通过以下方式使用它:
foo object1 = new foo();
foo.print_hello();
2)
线
stack *s1
将 s1 声明为指向结构 stat 的指针。但这还没有结束。您可以使用它来指向多个内存区域,每个区域都包含一个堆栈结构。
当你声明一个数组(例如一个 int 数组)时,你可以用传统的方式来做。
int integersArray [10];
(这样程序会自动分配内存,您不必担心)。您也可以使用指针。在这种情况下,您可以按如下方式声明您的数组。
int * integersArray;
这可以是指向一个或多个内存段的指针,具体取决于您如何分配它。请注意,上面的代码与上一个不同,它不分配内存,它只是声明了一个指向结构的指针。您需要通过以下方式显式分配内存
integersArray = malloc(10*sizeOf(int));
Wich 将分配足够的内存来容纳 10 倍于 int 的大小。即 10 个整数。在这两种情况下,您都可以使用 integersArray 作为普通数组和代码
printf("%d",integersArray[0]);
作品。在第二种情况下,您可以通过递增或递减指针来移动数组。通过做
integersArray++
您正在将指针移动到下一个内存部分。如果您执行 integersArray+=11; ,鉴于您的数组有 10 个位置,您现在处于无效的内存段中,并且任何事情都可能发生(如果您最终进入受保护的内存段,您的程序,如上面的评论中所指出的将被终止)。
@Alex:分割。只要他的随机指针取消引用(偶然)落在他的内存段内,C 就不会抱怨,他会收到恰好位于该内存位置的任何垃圾。一旦他到达他的段之外,内核很可能会杀死他的进程。– jforberg 1 小时前
您的程序基本上在做同样的事情,但使用 s1 代替。
3)这部分代码
s1=(stack*)malloc(sizeof(stack));
正在分配内存,足以容纳一种堆栈类型的结构。一般来说,要为 n 个元素分配内存,你会这样做
yourPointer = malloc(n*sizeof(structure));
那么,当您尝试像这样访问您的结构时,为什么您的程序可以正常工作?
s1[1].node.val=20;
printf("%d",s1[1].node.val);
我最好的猜测是您很幸运能够访问有效内存。但这可能并非总是如此。我建议您在处理动态内存时要非常小心。
注意:即使上述内容足够清楚,我也强烈建议您查看 K&R 的书,这会更清楚地解释它。