0

任何人都可以帮助我使用以下代码吗?程序运行正常。

这些是我的问题:

  1. 为什么点运算符在c中工作?
  2. s1当我只为一个结构分配足够的内存时,为什么我能够访问堆栈结构(即)两次?怎么变成数组了?
  3. 谁能解释一下这里的内存是如何分配的?

编码:

#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

4 回答 4

10
  1. 我不明白你的意思。点运算符访问结构的成员,这就是它的作用。
  2. 你不能,你在做违法的事情。C 没有阻止你做坏事的机制,尽管如果你做了“足够”的坏事,你的程序就会崩溃。你在这里很幸运。它没有变成一个数组,你只是把它当作一个数组来对待。编译器无法判断它是指向一个元素还是多个(数组)的指针,因此它允许您将任何指针视为数组。由你来确保这是一件有效的事情。
  3. 马洛克。
于 2012-07-13T21:27:56.177 回答
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)); 

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 的书,这会更清楚地解释它。

于 2012-07-14T02:03:26.380 回答
0

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

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

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

}

于 2012-07-13T21:57:33.733 回答
0

使用此代码,您只有一个 struct alocated :

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

对于两个位置尝试:

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

于 2012-07-13T21:35:11.277 回答