| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2109 人关注过本帖
标题:编译过了 运行老说某处内存不能为read
只看楼主 加入收藏
at445
Rank: 1
等 级:新手上路
帖 子:19
专家分:4
注 册:2011-6-14
收藏
得分:0 
回复 9楼 TonyDeng
书上的代码 从线性表最后一个数据开始分配,直到分配n个数据
您的意思是说不该在for循环中改变p的值对吗?
还是用malloc就只能一个萝卜一个坑

如果要改的话该怎么改法
2011-11-26 12:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
动态分配内存malloc()所获得的指针p,要在释放free()时再使用一次,因此这种模式的指针p必须是不能变的(指针所指的内容可以变,但指针本身不能变),它不应该被重新赋值,一旦如此,这个内存就失去了根,再也无法释放。现在,你的代码中用for循环反复分配内存,但都使用同一个指针p,8次循环,前面7个的内存都被废了。根据代码的意图,似乎是对指针形参L分配内存,而且依照参数n,应是分配n个元素的数组(L是数组名),但实际的代码,却是反复分配同一个p都赋值给L,L始终是同一个指针,它没有变成8个。因此,在你后来使用L->next的时候,那个地址是未知的,不出错才怪。

授人以渔,不授人以鱼。
2011-11-26 12:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
     for(i = n;i>0;--i)
      {
            p = (LinkList *)malloc(sizeof(LinkList));
            p->data = i;
            p->next = L->next;
           L->next = p;
      }
这个循环中,p->next = L->next,那么L->next是什么呢?前面用InitList(L)获得L,但在InitList()函数中,L->next=NULL。传递过来,p->next就成了NULL。我不知道你这个链怎么还连得起来。书上的代码真这样写?还有教人malloc()内存而不教free()的书,害死你。

授人以渔,不授人以鱼。
2011-11-26 12:29
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:2 
回复 13楼 TonyDeng
可以链起来,每次循环分配的内存都插在head的next

总有那身价贱的人给作业贴回复完整的代码
2011-11-26 12:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
1.这个链表是无法释放的
2.所报告的错误必定出在反复分配p=malloc()上,这是一个与操作系统实现有关的函数,旧式程序允许这种做法,未必所有系统都能这样做。

malloc is marked __declspec(noalias) and __declspec(restrict), meaning that the function is guaranteed not to modify global variables, and that the pointer returned is not aliased. For more information, see noalias and restrict.

授人以渔,不授人以鱼。
2011-11-26 13:05
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:2 
回复 15楼 TonyDeng
每次循环分配的内存插入到L和L->next之间,链表变成了L,下一个是p,再下一个是原来的L->next。下一次循环还是那么插入,比如又分配内存p1,链表变成了L,下一个是p1,再下一个是p,再下一个是原来的L->next

总有那身价贱的人给作业贴回复完整的代码
2011-11-26 13:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
不重复使用p就没事

授人以渔,不授人以鱼。
2011-11-26 13:28
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
初始化函数的入参不对

[ 本帖最后由 embed_xuel 于 2011-11-26 14:00 编辑 ]

总有那身价贱的人给作业贴回复完整的代码
2011-11-26 13:55
keaixiaou
Rank: 2
等 级:论坛游民
帖 子:9
专家分:21
注 册:2011-11-23
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>
typedef struct Lnode
{
        int data;
        struct Lnode *next;
}LinkList;
/***************************************************/
//函数申明
void InitList(LinkList *L);
void ListCreat(LinkList *L,int n);
//本地变量
LinkList ListHead,*head;

int main(int argc, char *argv[])
{
    head=&ListHead;
  ListCreat(&ListHead,8);
  system("PAUSE");   
  return 0;
}
void ListCreat(LinkList *L,int n)
{
    LinkList *p;
    int i,j=0;
    InitList(L);
    printf("Begin to input data!!\n");
    printf("you gonna creat an list which have %d int data\n",n);
    for(i = n;i>0;--i)
    {
        p = (LinkList *)malloc(sizeof(LinkList));
        p->data = i;
        p->next = L->next;
        L->next = p;
    }
    for (p=head;p->next!=NULL;p=p->next)
    {
        printf("%d",p->data);
    }
}     

void InitList(LinkList *L)
{
    printf("Initialization Begin!\n");
    printf("sizeof(Lnode)=%d\n",sizeof(LinkList));
    L = (LinkList *)malloc(sizeof(LinkList));
    L ->next = NULL;
    printf("Initialization End!\n");
}


你一开始的list的头指针有问题,我改的如上~~~,回去好好看C语言书
2011-11-26 14:59
mfh
Rank: 6Rank: 6
等 级:侠之大者
帖 子:179
专家分:411
注 册:2009-5-31
收藏
得分:6 
#include <stdio.h>
#include <stdlib.h>
typedef struct Lnode {
    int data;
    struct Lnode *next;
} LinkList;
/***************************************************/
//函数申明
void InitList(LinkList **L);//KEY
void ListCreat(LinkList *L, int n);
void ShowList(LinkList *L);
//本地变量
LinkList *ListHead = NULL;
int main(int argc, char *argv[]) {
    ListCreat(ListHead, 8);
    system("PAUSE");
    return 0;
}
void ListCreat(LinkList *L, int n) {
    LinkList *p;
    LinkList *head;
    int i, j = 0;
    InitList(&L);
    head = L;
    printf("Begin to input data!!\n");
    printf("you gonna creat an list which have %d int data\n", n);
    for (i = n; i > 0; --i) {
        p = (LinkList *) malloc(sizeof(LinkList));
        p->data = i;
        p->next = L->next;
        L->next = p;
    }
    ShowList(L);
}
void InitList(LinkList **L) {
    printf("Initialization Begin!\n");
    printf("sizeof(Lnode)=%d\n", sizeof(LinkList));
    *L = (LinkList *) malloc(sizeof(LinkList));
    //**L ->next = NULL;
    printf("Initialization End!\n");
}
void ShowList(LinkList *L)
{
        LinkList *p;
        p =L ->next;
        while(p != NULL)
        {
                fprintf(stderr,"number = %d\n",p->data);
                p =p ->next;   
        }
      
      
}
2011-11-26 17:16
快速回复:编译过了 运行老说某处内存不能为read
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016914 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved