结构内的结构

时间:2012-07-13 21:22:30

标签: c memory

有人可以帮我解决以下代码吗?该程序运行正常。

这是我的问题:

  1. 为什么点运算符在c?
  2. 中工作
  3. 当我为一个结构分配足够的内存时,为什么我能够访问堆栈结构(即s1)两次?它是如何成为阵列的?
  4. 有人可以解释一下如何分配内存吗?
  5. 代码:

    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    
    typedef struct
    {    
        struct mynode
        {
            int val;
            struct mynode *next;    
        } node;        
    } stack;
    
    int main()
    {
        stack *s1;
        s1=(stack*)malloc(sizeof(stack));
    
    
        s1[0].node.val=10;
        s1[1].node.val=20;
        printf("%d",s1[1].node.val);
    
        getch();
        return 0;
    }
    

4 个答案:

答案 0 :(得分:10)

  1. 我不知道你的意思。点运算符访问结构的成员,这就是它的作用。
  2. 你做不到,你做的事非法。 C没有机制阻止你做坏事,虽然你的程序会在你做“不够”的事情时崩溃。你在这里很幸运。 它没有成为一个数组,你只是把它当成一个。编译器无法判断它是否是指向一个元素或多个(数组)的指针,因此它允许您将任何指针视为数组。这取决于你确保这是一件有效的事情。
  3. 的malloc。

答案 1 :(得分:1)

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)); 

将分配足够的内存来保存int的10倍。也就是10个整数。 在这两种情况下,您都可以使用integersArray作为普通数组和代码

printf("%d",integersArray[0]);

的工作原理。 在第二种情况下,您可以通过递增或递减指针来移动数组。 通过做

integersArray++

您正在将指针移动到下一个内存部分。如果您执行integersArray + = 11; ,鉴于你的数组有10个位置,你现在处于一个无效的内存段,任何事情都可能发生(如果你最终进入受保护的内存段,你的程序,如上面的评论所指出的那样将被终止)。 p>

@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&amp; R的书,我会更清楚地解释它。

答案 2 :(得分:0)

使用此代码,您只分配了一个结构:

s1=(stack*)malloc(sizeof(stack));

对于两次分配,请尝试:

s1=(stack*)malloc(sizeof(stack) * 2);

答案 3 :(得分:0)

这段代码比你写的更深入。我会让你开始设置它,但我建议你在C中查找“链接列表”主题,因为这根本不像堆栈。

这是一些结构的代码,可以帮助您开始实现。这适用于您的情况,但如果您想继续,可能需要创建初始化程序和addNode函数。这是一个链接,以便您可以了解有关链接列表的更多信息: http://www.codeproject.com/Articles/24684/How-to-create-Linked-list-using-C-C

#include "stdlib.h"
#include "stdio.h"
typedef struct _node_ {
    int val;
    struct _node_ * next;
}mynode;

typedef struct _linkedlist_ {
    mynode * node;
}linkedlist;


int main() {
linkedlist * s1 = (linkedlist*) malloc(sizeof(linkedlist));
s1->node = malloc(sizeof(mynode));
s1->node->next = malloc(sizeof(mynode));
s1->node->val = 10;
s1->node->next->val = 20;
printf("%d",s1->node->next->val);
free(s1->node->next);
free(s1->node);
free(s1);
//getch(); //don't know what this is for
return 0;

}