在winTC下可以运行,但是在VC下就报内存错误,为什么?

#include<stdio.h>#include<malloc.h>typedefstructNode{structNode*prior;intdata;structN... #include<stdio.h>
#include<malloc.h>
typedef struct Node
{
struct Node *prior;
int data;
struct Node *next;
}DLinkList;
DLinkList *head;
int InitDList(DLinkList *DL)
{
DL=(DLinkList *)malloc(sizeof(DLinkList));
if(DL!=NULL)
{
printf("success!\n");
DL->next=NULL;
DL->prior=NULL;
return(1);
}
else
return(0);
}
int DLInsert(DLinkList *DL)
{
DLinkList *temp,*node;
temp=DL;
while(temp->next!=NULL)
{temp=temp->next;}
node=(DLinkList *)malloc(sizeof(DLinkList));
if(node==NULL)
return 0;
node->data=6;
node->prior=temp;
node->next=NULL;
temp->next=node;
return 1;
}
main()
{
InitDList(head);
DLInsert(head);
}
展开
 我来答
叶片舟
2013-06-26 · TA获得超过652个赞
知道小有建树答主
回答量:285
采纳率:100%
帮助的人:316万
展开全部

楼主,你这个错误,比较典型了

你的InitDList(DLinkList *DL)函数中,开辟了堆空间,并传给了指针DL,但是这个DL并不是和你传进来的那个实参是一个,而是,实参的一个副本

这个就好像这个在被调函数中交换两个数一样,如果传参,是不能改变的

void Swap(int a, int b)
{
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
}
int a = 4;
int b = 3;
Swap(a, b); //这个函数调用之后不会交换a, b,因为穿进去的只是实参的拷贝,所以用指针解决

但是在你的这个程序中,你想改变的是指针的值,而不是改变指针指向的值,所以,你必须用二级指针或者返回值为指针来解决

例如下面这样
DLinkList *InitDList()
{
    DLinkList *DL=(DLinkList *)malloc(sizeof(DLinkList));
   
   return DL;
}

int main()
{
head = InitDList();
//在主函数判断是否开辟成功
if(head == NULL)
{
//
}
}
追问
二级指针?怎么用?
追答
int a;
int *p = &a;
int **lp = &p;
lp就是二级指针,就是指向指针的指针,这样才可以修改指针的内容
指针修改的是指针指向的内容
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式