有人可以帮我解决以下代码吗?该程序运行正常。
这是我的问题:
s1
)两次?它是如何成为阵列的?代码:
#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;
}
答案 0 :(得分:10)
答案 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;
}