其实解决问题的方法很简单

大家好!我是编码小哥,欢迎关注,持续分享更多实用的编程经验和开发技巧,共同进步! 

本例是一个动态数组的例子,实现数据的增加、删除、根据索引修改数值、获取数值。 

dynamic_array.c

#include "dynamic_array.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>dynamic_array_t *init_dynamic_array()
{dynamic_array_t *da = malloc(sizeof(dynamic_array_t));da->items = calloc(DEFAULT_CAPACITY, sizeof(void *));da->capacity = DEFAULT_CAPACITY;return da;
}void *add(dynamic_array_t *da, const void *value)
{if (da->size >= da->capacity){void **newItems = realloc(da->items, (da->capacity <<= 1) * sizeof(void **));//free(da->items);da->items = newItems;}void *copy_value = retrive_copy_of_value(value);da->items[da->size++] = copy_value;return copy_value;
}void *put(dynamic_array_t *da, const void *value, const unsigned index)
{if (!contains(da->size, index))return INDEX_OUT_OF_BOUNDS;free(da->items[index]);void *copy_value = retrive_copy_of_value(value);da->items[index] = copy_value;return copy_value;
}void *get(dynamic_array_t *da, const unsigned index)
{if (!contains(da->size, index))return INDEX_OUT_OF_BOUNDS;return da->items[index];
}void delete (dynamic_array_t *da, const unsigned index)
{if (!contains(da->size, index))return;for (unsigned i = index; i < da->size; i++){da->items[i] = da->items[i + 1];}da->size--;free(da->items[da->size]);
}unsigned contains(const unsigned size, const unsigned index)
{//printf("size:%d,index:%d\n", size, index);if (size >= 0 && index < size)return 1;printf("index [%d] out of bounds!\n", index);return 0;
}void *retrive_copy_of_value(const void *value)
{void *value_copy = malloc(sizeof(void *));memcpy(value_copy, value, sizeof(void *));return value_copy;
}

 dynamic_array.h

#ifndef __DYNAMIC_ARRAY__
#define __DYNAMIC_ARRAY__
#define DEFAULT_CAPACITY 1 << 4
#define INDEX_OUT_OF_BOUNDS NULLtypedef struct dynamic_array
{void **items;unsigned size;unsigned capacity;
} dynamic_array_t;extern dynamic_array_t *init_dynamic_array();extern void *add(dynamic_array_t *da, const void *value);extern void *put(dynamic_array_t *da, const void *value, unsigned index);extern void *get(dynamic_array_t *da, const unsigned index);extern void delete (dynamic_array_t *da, const unsigned index);unsigned contains(const unsigned size, const unsigned index);extern void *retrive_copy_of_value(const void *value);

main.c

#include "dynamic_array.h"int main()
{dynamic_array_t *da = init_dynamic_array();for (int i = 1; i <= 50; i++){add(da, &i);}delete (da, 10);int value = 999;put(da, &value, 0);#if 1//value = 666;int another_value = 666;add(da, &another_value);#endif#if 0for (int i = 0; i < da->size; i++){printf("value[%d]=%d\n",i, *(int *)get(da, i));}
#endifint value_for_invalid_index = 10000;//put(da, &value_for_invalid_index, 150);//put(da, &value_for_invalid_index, 65);put(da, &value_for_invalid_index, 49);for (int i = 0; i < da->size; i++){printf("value[%d]=%d\n",i, *(int *)get(da, i));}free(da->items);return 0;
}

 Makefile:

CC = gcc
CFLAGS = -g -Wallall: mainmain: main.o dynamic_array.o$(CC) $(CFLAGS) $^ -o $@dynamic_array.o: dynamic_array.c$(CC) $(CFLAGS) -c $^clean: rm *.o main

 刚开始运行结果是这样的:

f948ecda656440879e5f5cc53ca438b4.png

 于是乎这样调试:

7a6e2ce92b804d57aa96cf8d3d7dae31.png

16915178cf834be1b9bd3bb9421f9944.png

 利用core文件调试:

先设置一下

ulimit -c unlimited

运行一下在当前目录下生成core文件

root@ubuntu-virtual-machine:/home/ubuntu/test# gdb main

gdb结合core文件调试

81464bd4f90448c180d55c57bc3ceb0a.png

代码修正后运行结果:

value[0]=999
value[1]=2
value[2]=3
value[3]=4
value[4]=5
value[5]=6
value[6]=7
value[7]=8
value[8]=9
value[9]=10
value[10]=12
value[11]=13
value[12]=14
value[13]=15
value[14]=16
value[15]=17
value[16]=18
value[17]=19
value[18]=20
value[19]=21
value[20]=22
value[21]=23
value[22]=24
value[23]=25
value[24]=26
value[25]=27
value[26]=28
value[27]=29
value[28]=30
value[29]=31
value[30]=32
value[31]=33
value[32]=34
value[33]=35
value[34]=36
value[35]=37
value[36]=38
value[37]=39
value[38]=40
value[39]=41
value[40]=42
value[41]=43
value[42]=44
value[43]=45
value[44]=46
value[45]=47
value[46]=48
value[47]=49
value[48]=50
value[49]=10000

其实,一开始运行的时候,报错日志就给出了答案,并不需要这么大费周章地调试,debug就像生活一样,有时问题看似很复杂,其实回过头来看一看,答案就在眼前。

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/706134.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安防监控视频平台EasyNVR级联视频上云系统EasyNVS出现“Login error”报错的原因排查

EasyNVR安防视频云平台是旭帆科技TSINGSEE青犀旗下支持RTSP/Onvif协议接入的安防监控流媒体视频云平台。平台具备视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频能力&#xff0c;能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、W…

WebRTC实时音视频通话之语音通话设计与实践

一、背景 在移动互联网流量时代&#xff0c;很多业务场景都有音视频通信的需求&#xff0c;比如IM场景&#xff0c;除了文字交流还需要音视频通话进行实时交互。为了帮助58、赶集、安居客等业务线更好的为用户提供服务&#xff0c;节约沟通成本&#xff0c;提升效率&#xff0…

Qt编译和使用freetype矢量字库方法

在之前讲过QT中利用freetype提取字库生成图片的方法&#xff1a; #QT利用freetype提取字库图片_qt freetype-CSDN博客文章浏览阅读1.2k次。这是某个项目中要用到的片段&#xff0c;结合上一篇文章#QT从字体名获取字库文件路径使用// 保存位图int SaveBitmapToFile(HBITMAP hBi…

CSS引入方式

CSS引入方式 1 行内式2 内嵌式3 连接式/外部样式表 1 行内式 行内式,通过元素开始标签的style属性引入 样式语法为&#xff1a; 样式名:样式值; 样式名:样式值; 代码 <input type"button" value"按钮"style"display: block;width: 60px; height: 4…

45°和68°焕新上市,五粮液完成产品体系化布局

执笔 | 尼 奥 编辑 | 扬 灵 如今&#xff0c;白酒行业正经历周期性调整&#xff0c;头部化和品牌化集中趋势日益显著。五粮液在这一关键时刻&#xff0c;敏锐地捕捉到市场机遇&#xff0c;通过产品焕新&#xff0c;进一步完善和丰富了其代际系列产品体系。 这一举措不仅巩…

24年湖南三支一扶报名流程图及报名照片要求

24湖南三支一扶报名流程图&#xff0c;照片要求☑️ ✔️报名时间&#xff1a;5月15日9:00至5月23日17:00 ✔️报名方式 报考人员登录市州人力资源社会保障局官网、市州人事考试网等查看各地公告&#xff0c;按要求报名。 ✔️报名流程&#xff08;湖南各地市单独报名&…

MATLAB基础—变量及其操作

众所周知&#xff0c;计算机所处理的数据都是存放在内存单元中的&#xff0c;而每个内存单元都有一个唯一的地址&#xff0c;程序就是通过这个内存单元的地址来访问内存单元的。 在高级语言中&#xff0c;只需要给每个内存单元取一个名字&#xff0c;然后通过这个名字就能够访问…

kubernetes二进制多master部署

文章目录 一、master02 节点部署&#xff08;在上期博客部署完成的情况下&#xff09;1、准备master02节点需要的文件2、修改配置文件kube-apiserver中的IP3、启动各服务并设置开机自启4、查看node节点状态 二、负载均衡部署1、配置load balancer集群双机热备负载均衡1.1 准备n…

【Shell】shell编程之数组

目录 一、数组的概念 二、数组定义方法 三、数组 1.获取数组长度 2.获取数组数据列表 3.获取数组下标列表 4.读取某下标赋值 5.数组遍历 6.数组切片 7.数组替换 8.数组删除 四、数组追加元素 五、向函数传数组参数 ​编辑六、数组排序算法 1.冒泡排序 2.直接选…

计算机毕业设计hadoop+hive+hbase学情分析 在线教育大数据 课程推荐系统 机器学习 深度学习 人工智能 大数据毕业设计 知识图谱

毕 业 设 计&#xff08;论 文&#xff09;开 题 报 告 1&#xff0e;结合毕业设计&#xff08;论文&#xff09;课题情况&#xff0c;根据所查阅的文献资料&#xff0c;每人撰写不少于1000字的文献综述&#xff1a; 一、研究背景和意义 “互联网”和大数据带来了网络教育的蓬…

Google:站长移除无效网址

当您的网址不需要呈现在Google站长中时&#xff0c;您可以在站长工具中移除网址 操作步骤&#xff1a;登录Google站长&#xff0c;绑定网站完成后&#xff0c;点击左侧删除 >> 输入网址 如果遇到一些网址&#xff0c;可以找寻网址间的规律&#xff0c;比如说&#xff0…

16.投影矩阵,最小二乘

文章目录 1. 投影矩阵1.1 投影矩阵P1.2 投影向量 1. 投影矩阵 1.1 投影矩阵P 根据上节知识&#xff0c;我们知道当我们在解 A X b AXb AXb的时候&#xff0c;发现当向量b不在矩阵A的列空间的时候&#xff0c;我们希望的是通过投影&#xff0c;将向量b投影到矩阵A的列空间中&…