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

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

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

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.xdnf.cn/news/1424837.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

月薪3万,沉迷“薅羊毛”

在网购江湖中&#xff0c;蟹老板是一位拥有十年经验的资深“羊毛党”。 他不仅是位精明的数学家&#xff0c;更是一位高效的“生产线”工人&#xff0c;专注于各大网购平台的优惠机制。每逢618大促&#xff0c;他总能凭借超凡的洞察力和手速&#xff0c;轻松斩获丰厚的“羊毛”…

每日一题——力扣26. 删除有序数组中的重复项(举一反三)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客​专栏&#xff1a;每日一题——举一反三 目录 我的写法&#xff1a; 代码点评&#xff1a; 时间复杂度分析&#xff1a; 空间复杂度分析&#xff1a; 总结&#xff1a; 我要更好&am…

ue引擎游戏开发笔记(41)——行为树的建立(2)--丰富ai行为:巡逻后返回原处

1.需求分析&#xff1a; 就敌人ai而言&#xff0c;追踪到敌人有可能丢失目标&#xff0c;丢失目标后应该能返回原来位置&#xff0c;实现这一功能。 2.操作实现&#xff1a; 1.思路&#xff1a;利用clear value函数&#xff0c;禁用掉当前的追踪功能&#xff0c;执行之后的返…

Java | Leetcode Java题解之第91题解码方法

题目&#xff1a; 题解&#xff1a; class Solution {public int numDecodings(String s) {int n s.length();// a f[i-2], b f[i-1], cf[i]int a 0, b 1, c 0;for (int i 1; i < n; i) {c 0;if (s.charAt(i - 1) ! 0) {c b;}if (i > 1 && s.charAt(i …

C++ 计时器

文章目录 一、简介二、实现代码2.1 windows平台2.2 C标准库 三、实现效果 一、简介 有时候总是会用到一些计时的操作&#xff0c;这里也整理了一些代码&#xff0c;包括C标准库以及window自带的时间计算函数。 二、实现代码 2.1 windows平台 StopWatch.h #ifndef STOP_WATCH_H…

C++ static_cast学习

static_cast可实现&#xff0c; 1 基本类型之间的转换 2 void指针转换为任意基本类型的指针 3 用于有继承关系的子类与父类之间的指针或引用的转换 用于基本类型转化时&#xff0c;会损失精度类似于C语言的强制转化&#xff1b; 下面先看一下void指针的转换&#xff1b; …

CSS学习笔记之中级教程(二)

-.CSS学习笔记之中级教程&#xff08;一&#xff09; 6、CSS 布局 - display: inline-block 与 display: inline 相比&#xff0c;主要区别在于 display: inline-block 允许在元素上设置宽度和高度。 同样&#xff0c;如果设置了 display: inline-block&#xff0c;将保留上下…

【数据库】知识总结(期末复习)

题型&#xff1a; 一、选择题(共10题&#xff0c;每题2分&#xff0c;共20分) 二、填空题(共10空&#xff0c;每空1分&#xff0c;共10分) 三、关系代数计算题&#xff08;共5题&#xff0c;每题2分&#xff0c;共10分&#xff09; 四、SQL计算题(共10题&#xff0c;每题3分…

C++ | Leetcode C++题解之第92题反转链表II

题目&#xff1a; 题解&#xff1a; class Solution { public:ListNode *reverseBetween(ListNode *head, int left, int right) {// 设置 dummyNode 是这一类问题的一般做法ListNode *dummyNode new ListNode(-1);dummyNode->next head;ListNode *pre dummyNode;for (i…

东莞酷得电子方案 遥控水弹坦克车

首先遥控小车是一种能够通过无线遥控器进行远程操控的小型机器人。遥控小车应用了哪些软硬件技术呢&#xff1f;本文将从以下几个方面进行详细介绍。 遥控小车应用了多种软硬件技术&#xff0c;涉及底盘结构、动力系统、传感器、控制器等多个方面。 底盘结构&#xff1a;遥控…

PostgreSQL扩展之PGroonga:多语言全文搜索

简介 PGroonga 是一个 PostgreSQL 扩展&#xff0c;它增加了基于 Groonga 的全文搜索索引方法。虽然原生的 PostgreSQL 支持全文索引&#xff0c;但它仅限于基于字母和数字的语言。PGroonga 提供了更广泛的字符支持&#xff0c;使其成为 PostgreSQL 支持的语言的超集&#xff…

【考研数学】张宇《1000题》强化阶段正确率多少算合格?

张宇1000题真的很练人心态.... 基础不好&#xff0c;建议别碰1000题 基础好&#xff0c;1000题建议在两个月以内刷完 如果自己本身在基础阶段学的比较水&#xff0c;自己的薄弱点刷了一小部分题没有针对性完全解决&#xff0c;转身去刷1000题就会发现&#xff0c;会的题目刷…

一线互联网大数据面试题核心知识库(100万字)

本面试宝典涵盖大数据面试高频的所有技术栈&#xff0c;包括Liunx&Shell基础&#xff0c;Hadoop&#xff0c;Zookpeer&#xff0c;Flume&#xff0c;Kafka&#xff0c;Hive&#xff0c;Datax&#xff0c;Maxwell&#xff0c;DolphinScheduler&#xff0c;Spark Core&SQ…

王炸!OpenAI全新模型GPT-4o推出!免费使用,实时语音视频交互来了!

北京时间5月14日凌晨&#xff0c;OpenAI 春季新品发布会举行&#xff0c;新一代旗舰生成模型 GPT-4o来了。GPT-4o 的推出代表着技术进步的一大步&#xff0c;集成了文本、语音和图像三种模态&#xff0c;使人机交互更加自然和高效。 这样的话&#xff0c;目前可以使用的版本包括…

[Linux][网络][高级IO][三][IO多路转接][epoll]详细讲解

目录 1.IO多路转接之epoll1.epoll初识2.epoll_create()3.epoll_ctl()4.epoll_wait()5.epoll工作原理6.epoll使用过程三部曲7.epoll的优点(和select缺点对应)8.思考 && 问题 2.epoll工作方式0.感性理解 && 铺垫1.水平触发(Level Triggered)工作模式2.边缘触发(E…

webpack优化构建速度示例-externals:

externals 配置项主要用于防止将某些 import 的包&#xff08;package&#xff09;打包到 bundle 中&#xff0c;而是在运行时&#xff08;runtime&#xff09;再从外部获取这些扩展依赖&#xff08;external dependencies&#xff09;。这样做的主要目的是为了解决打包文件过大…

cypress的安装使用

cypress npm install -g cnpm --registryhttps://registry.npm.taobao.org cypress的启动打开 npx cypress open js函数的回调 function print(string,callback){console.log(string)callback() } print("a",function(){print("b",function(){console.l…

spark知识点

目录 第二章Scala基础 一.Scala常用数据类型 二.定义与使用数组 三.定义与使用函数 四.定义与使用列表 五.定义与使用集合 六.定义与使用映射 七.定义与使用元组 第三章Spark编程基础 一.从内存中读取创建RDD 二.从外部存储系统中读取数据创建RDD 三.RDD方法归纳 1.…

Qt+C++串口调试工具

程序示例精选 QtC串口调试工具 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《QtC串口调试工具》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用推荐首选。 …

异步编程CompletableFuture总结

文章目录 1. 简介&#xff1a;2. 比较1、传统方式2、使用CompletableFuture&#xff1a;异步执行返回值 3、组合处理&#xff1a;anyOfallof : 4. 异步回调&#xff1a;thenAcceptthenApplywhenComplete等同于 thenAccepthandel()等同于thenApply 5. 常用方法&#xff1a;1、su…