#include<stdio.h>
#include<stdlib.h>
struct node
{
int v;
struct node *next;
};
void printAll(node *head)
{
node *p;
p=head;
while(p)
{
printf("%d\t",p->v);
p=p->next;
}
printf("\n");
}
int main(int argc, char* argv[])
{
node *head;
head=(node*)malloc(sizeof(node));
head->v=0;
//1.下面这两种添加尾节点的方法有何区别或者利弊?
//2.尾节点的NULL指针是否应该显式指定?默认的不是NULL?
/*
node *n1;
n1=(node*)malloc(sizeof(node));
n1->v=1;
n1->next=NULL;
head->next=n1;
*/
node n1;
n1.v=1;
n1.next=NULL;
head->next=&n1;
printAll(head);
system("pause");
return 0;
}
请修改上面我的代码,用局部变量的方式,使其造成你上面说的“意外的结果”或者“溢出的危险”。
追答想要堆栈溢出很容易:
struct node
{ int v[1024];
struct node *next;
};
void main()
{ int i;
node nd[10240];
for(i=0;i<10240;i++)
{ nd[i].v[0]=0;
}
}
运行时直接堆栈溢出。
如果nd[10240]改成内存分配方式就不会溢出。
你这个结构体的结构比我定义那个复杂多了,根据你的代码确实报错了,是堆栈溢出,那请问你应该怎么修改成malloc的格式呢?麻烦你再贴一下代码吧。
追答不建议用malloc, 还是用new吧。
struct node
{ int v[1024];
struct node *next;
};
void main()
{ int i;
node *nd=new node[10240];
for(i=0;i<10240;i++)
{ nd[i].v[0]=0;
}
delete[] node;
}
c语言咋写啊,new是c++的了。
追答C的话:
struct node *nd=(node *)malloc(10240*sizeof(node));
不好意思,我太菜了,你能不能把main里面的用malloc全部写一下?我这边不知道怎么改。
追答void main()
{ int i;
struct node *nd=(node *)malloc(10240*sizeof(node));
for(i=0;i<10240;i++)
{ nd[i].v[0]=0;
}
free(nd);
}
如同tmduser所说 ,方法一内存是c运行库向系统申请的一段静态地址 ,你不用free的话可以一直使用 ,但是已经不用且没有free就会造成内存溢出直至进程结束 ,方法二是在函数里声明的变量 ,则它只在函数运行时存在 ,在函数返回时释放 ,由于它是处于栈堆里的 ,若当函数是返回你还在使用 ,也许就会修改到正在执行的函数里所声明的变量的值
不管是声明的变量(栈堆)或是申请的内存(malloc) ,编译器都不会对其进行初始化 ,也就是说如果刚才栈堆或者malloc申请的内存里面的数据不全为0 ,则将会导致尾节点的next值不为NULL ,这将会导致错误的内存访问
你上面说的危险是内存不足的危险吧,与我提问是两回事。