鱼C论坛

 找回密码
 立即注册
查看: 2300|回复: 8

[已解决]为什么这里会显示异常

[复制链接]
发表于 2023-3-6 20:14:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define ElemType int

  4. //定义单链表
  5. typedef struct LNode{
  6.         ElemType data;
  7.         LNode* next;
  8. }LNode ,*LinkList;

  9. //初始化不带头节点的单链表
  10. void InitList_n(LinkList &l)
  11. {
  12.         l = NULL;
  13. }

  14. //尾插法建立不带头节点的单链表
  15. void Establish_n(LinkList l,ElemType A[],int len)
  16. {
  17.         int i = 0;
  18.         LNode* r = l, * s;
  19.         while (i < len - 1)
  20.         {
  21.                 s = (LNode*)malloc(sizeof(ElemType));
  22.                 s->data = A[i];
  23.                 if (NULL == r)
  24.                 {
  25.                         r = l = s;
  26.                         i++;
  27.                         continue;
  28.                 }
  29.                 r->next = s;
  30.                 r = s;
  31.                 i++;
  32.         }
  33.         r->next = NULL;
  34. }
  35. int main()
  36. {
  37.         int A[10] = { 0,1,2,3,4,5,6,7,8,9 };
  38.         //声明一个不带头节点的单链表
  39.         LinkList l;
  40.         InitList_n(l);
  41.         Establish_n(l, A, 10);


  42. }
复制代码
最佳答案
2023-3-7 10:18:30

  1. //定义单链表
  2. typedef struct LNode{
  3.         ElemType data;
  4.         LNode* next;
  5. }LNode ,*LinkList;

  6. LNode* r = l, * s;
  7. s = (LNode*)malloc(sizeof(ElemType));
复制代码


LNode *s 指针的地址不应该是4字节吧?  那么你强制转换4字节为(LNode *) 可不就造成空间破坏

你或许应该这样做:

  1. s = (LNode*)malloc(sizeof(LNode));
复制代码
微信截图_20230306201408.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-3-6 23:04:19 | 显示全部楼层
本帖最后由 jhq999 于 2023-3-6 23:10 编辑
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define ElemType int

  4. //定义单链表
  5. typedef struct LNode{
  6.         ElemType data;
  7.         LNode* next;
  8. }LNode ,*LinkList;

  9. //初始化不带头节点的单链表
  10. void InitList_n(LinkList &l)
  11. {
  12.         l = NULL;
  13. }

  14. //尾插法建立不带头节点的单链表
  15. void Establish_n(LinkList &l,ElemType A[],int len)//////////&l
  16. {
  17.         int i = 0;
  18.         LNode* r=l,* s;
  19.         while (i < len - 1)
  20.         {
  21.                 s = (LNode*)malloc(sizeof(ElemType));
  22.                 s->data = A[i];
  23.                 if (NULL == r)
  24.                 {
  25.                         r=l = s;

  26.                         i++;
  27.                         continue;
  28.                 }
  29.                 r->next = s;
  30.                 r = s;
  31.                 i++;
  32.         }
  33.         r->next = NULL;
  34. }
  35. int main()
  36. {
  37.         int A[10] = { 0,1,2,3,4,5,6,7,8,9 };
  38.         //声明一个不带头节点的单链表
  39.         LinkList l;
  40.         InitList_n(l);
  41.         Establish_n(l, A, 10);
  42.         LinkList p=l;
  43.         while(p)
  44.         {
  45.             printf("%d ",p->data);
  46.             p=p->next;

  47.         }

  48. }
复制代码
MMP刚刚把尾插法看成头插法了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-7 10:18:30 | 显示全部楼层    本楼为最佳答案   

  1. //定义单链表
  2. typedef struct LNode{
  3.         ElemType data;
  4.         LNode* next;
  5. }LNode ,*LinkList;

  6. LNode* r = l, * s;
  7. s = (LNode*)malloc(sizeof(ElemType));
复制代码


LNode *s 指针的地址不应该是4字节吧?  那么你强制转换4字节为(LNode *) 可不就造成空间破坏

你或许应该这样做:

  1. s = (LNode*)malloc(sizeof(LNode));
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-7 11:33:41 | 显示全部楼层
jhq999 发表于 2023-3-6 23:04
MMP刚刚把尾插法看成头插法了

所以楼主问的堆损坏是为什么呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-7 11:56:22 | 显示全部楼层
本帖最后由 jhq999 于 2023-3-7 12:07 编辑
微光拼图 发表于 2023-3-7 11:33
所以楼主问的堆损坏是为什么呢?


3楼不是说了吗? ,主要还是我眼瞎了,编译器警告设低了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-7 12:10:35 | 显示全部楼层
cjgank 发表于 2023-3-7 10:18
LNode *s 指针的地址不应该是4字节吧?  那么你强制转换4字节为(LNode *) 可不就造成空间破坏

你或 ...

原来如此,那为什么前两次循环就没有异常呢;还有第18行那里传入的参数 l 不是一个指针吗,那为什么还要用引用?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-8 07:02:33 | 显示全部楼层
小丑9 发表于 2023-3-7 12:10
原来如此,那为什么前两次循环就没有异常呢;还有第18行那里传入的参数 l 不是一个指针吗,那为什么还要 ...

不用引用,子函数里的形参l=s;而主函数的实参l不变,不等于第一个s
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-8 11:36:04 From FishC Mobile | 显示全部楼层
jhq999 发表于 2023-3-8 07:02
不用引用,子函数里的形参l=s;而主函数的实参l不变,不等于第一个s

那为什么传参的时候是一个数组的时候就可以不用引用呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-8 12:24:55 | 显示全部楼层
本帖最后由 jhq999 于 2023-3-8 12:31 编辑
小丑9 发表于 2023-3-8 11:36
那为什么传参的时候是一个数组的时候就可以不用引用呢?


先搞明白实参不随形参改变而改变;
主函数里的l和子函数里的参数l是两个变量
当叫到子函数时,是把主函数变量l的值赋值给了子函数的参数l,
所以子函数里改变子函数l的值;而主主函数里的l没有改变还是NULL



小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 17:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表