日常板砖之代码调试经验之谈

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void upcase(char *inputstring, char **newstring);

int main(void)
{
	char *string = NULL;
	upcase("Hello", &string);
	printf("str1 = %s\n", string);

	upcase("Goodbye", &string);
	printf("str2 = %s\n", string);
	free(string);
	return 2;
}

void upcase(char *inputstring, char **newstring)
{
	int counter;
	if (NULL == *newstring)
	{
		if (NULL == (*newstring = malloc(strlen(inputstring) + 1)))
		{
			 printf("THE LINE IS %d.\n", __LINE__);

			printf("ERROR ALLOCATING MEMORY!\n");
			exit(255);
		}

	}
	else
	{
		if (NULL == (*newstring = realloc(*newstring, sizeof(inputstring) + 1)))
		{
			 printf("ERROR ALLOCATING MEMORY!\n");
             exit(255);
		}
	}

	strcpy(*newstring, inputstring);

	for(counter = 0; counter<strlen(*newstring); counter++)
	{
		if(*newstring[counter] >= 97 && *newstring[counter] <= 122)
			*newstring[counter] -= 32;
	}
}




这篇代码是调整动态内存大小的示例。文件为(realloc.c)

代码具体指的是realloc函数的调用。函数原型:void* realloc(void *ptr, size_t  size);

realloc函数的作用是重新调整一块动态内存区域的大小,参数ptr是指向要调整的动态内存的额指针。如果参数ptr为NULL,则函数realloc的作用相当于函数malloc。如果参数size为0,则函数realloc的作用相当于函数free。

但是在练习过程中出现了“Segmentation fault (core dumped)”错误。

这是这篇博客的目的。第一,使用gdb解决这个问题;第二,最终出问题的原因是什么。

因为在解决过程了收到了一篇博客的启发和引导,所以在此声明一下,http://blog.youkuaiyun.com/deutschester/article/details/6739861,感谢这篇博客的作者。

~# gcc  realloc.c

~# ./a.out

执行之后

~# Segmentation fault (core dumped)

首先,楼主采用在代码中添加打印信息查找问题所在

printf("The LINE is %d, The FILE is %s.\n", __LINE__, __FILE__);

但是没有解决问题。

接着,使用gdb调试工具

~# gcc reallo.c -g

~# gdb a.outCopyright (C) 2014 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.  Type "show copying"and "show warranty" for details.This GDB was configured as "i686-linux-gnu".Type "show configuration" for configuration details.For bug reporting instructions, please see:<http://www.gnu.org/software/gdb/bugs/>.Find the GDB manual and other documentation resources online at:<http://www.gnu.org/software/gdb/documentation/>.For help, type "help".Type "apropos word" to search for commands related to "word"...Reading symbols from a.out...done.(gdb) 

直接运行   

(gdb) runStarting program: /mnt/hgfs/A_Windows_share/test/a.out Program received signal SIGSEGV, Segmentation fault.0x080486ac in upcase (inputstring=0x80487b0 "Hello", newstring=0xbffff09c) at 2.c:4646 if(*newstring[counter] >= 97 && *newstring[counter] <= 122)

提示我们访问非法的内存。执行backetrace(=bt)命令。查看栈信息的命令。

(gdb) bt#0  0x080486ac in upcase (inputstring=0x80487b0 "Hello", newstring=0xbffff09c) at 2.c:46#1  0x08048592 in main () at 2.c:10

切换到0号堆栈帧(stack frame 0)来看看程序在哪里崩溃的。

(gdb) frame 0#0  0x080486ac in upcase (inputstring=0x80487b0 "Hello", newstring=0xbffff09c) at 2.c:4646 if(*newstring[counter] >= 97 && *newstring[counter] <= 122)

指向了46行的代码,楼主猜测可能是“*newstring[counter]”访问内存出错。打印一下结果。

(gdb) print *newstring[counter]Cannot access memory at address 0x0(gdb) print *newstring[0]$1 = 72 'H'(gdb) print *newstring[1]$2 = 85 'U'(gdb) print *newstring[2]Cannot access memory at address 0x0

几次打印出来,结果都不稳定的。所以楼主确认是此处访问内存出错。

因为“[]”小括号的优先级比“*”指针符号的优先级要高 ,所以这句代码可能执行为“*(newstring[counter])”,newstring指针在代码中为二级指针,这样访问会造成访问内存出错。

修改为“(*newstring)[counter]”,重新编译,成功运行。

这篇练习代码给我最大的启发是在执行代码中出了错,gdb是不错的调试工具。

经验:使用指针时可能会导致指向的位置不确定,一定要注意。



                
<think>好的,用户之前问过芙宁娜是否需要抽专武,现在接着问“用板砖怎么样”,也就是用圣显之钥这把武器的情况。首先,我需要确认用户提到的“板砖”是否确实指圣显之钥,因为玩家社区里常用昵称,必须确保正确对应。圣显之钥是妮露的专武,通常给生命值角色使用,而芙宁娜的技能确实依赖生命值,所以有一定的适配性。 接下来,要分析圣显之钥对芙宁娜的适用性。首先看武器属性,主属性是542基础攻击力和66.2%生命值加成,被动提升生命值并根据元素战技命中次数提升全队精通。芙宁娜主要依赖生命值来提升伤害和辅助能力,所以高额的生命加成对她很有用。但被动中的精通提升对芙宁娜自身增益不大,因为她的输出和辅助不依赖精通,不过可以辅助队伍中的其他角色,比如那维莱特或者胡桃等需要精通的角色。 然后比较其他武器,比如专武静水流涌之辉和四星的灰河渡手。专武提供充能和增伤,而圣显之钥则提供更高的生命值。芙宁娜的充能需求较高,如果使用圣显之钥可能需要更注重充能沙漏或副词条来弥补充能缺口,否则可能影响大招循环。需要计算充能是否足够,比如在单水队伍中需要多少充能,圣显之钥不带充能的话是否可行。 另外要考虑队伍配置,如果队伍中有其他水系角色帮助充能,或者携带西风系列武器,可能缓解充能压力。比如双水队伍加上西风剑,充能需求会降低,这时候圣显之钥的高生命加成会更有效。 还要对比其他五星武器,比如绿剑磐岩结绿,同样提供高额生命加成,但副属性是暴击率,可能更适合输出向的芙宁娜。而圣显之钥的被动对队伍的精通加成,如果队伍中有需要精通的角色,可以提升整体输出,但芙宁娜自身可能无法充分利用。 接下来需要总结优缺点,圣显之钥的优势是高生命加成提升芙宁娜的伤害和治疗量,被动辅助队友的精通;缺点是缺乏充能,可能影响循环,且被动部分效果对芙宁娜自身提升有限。适用场景是生命需求高且有队友需要精通的队伍,比如绽放队或者那维莱特队伍。 最后给出抽取建议,如果有现成的圣显之钥,可以给芙宁娜使用,但没必要专门抽取,除非同时需要妮露或其他角色。如果追求芙宁娜的最佳输出,专武或绿剑可能更合适。同时提醒用户注意充能问题,可能需要调整圣遗物或队伍配置。</think>关于芙宁娜使用「圣显之钥」(俗称“板砖”)的适配性分析如下: --- ### 一、武器属性量化对比 | 属性 | 圣显之钥 | 专武(静水流涌) | 灰河渡手(四星) | |----------------|----------------------|----------------------|------------------| | **主属性** | 542攻+66.2%生命 | 542攻+88.2%暴伤 | 510攻+45.9%充能 | | **被动特效** | 生命转化+全队精通辅助| 增伤叠加+充能补偿 | 战技暴击率提升 | --- ### 二、适配性核心评估 #### 1. **生命收益临界值** - 芙宁娜Q技能增伤比例与生命值关联: $$ \Delta DMG\% = 0.35\% \times HP_{\text{超出30000部分}} $$ 圣显之钥可提供$HP_{\text{基础}} \times 66.2\%$加成,90级芙宁娜基础生命15,275→**实际提升10,112点生命** #### 2. **充能缺口验证** - 单水队伍充能需求公式: $$ ER_{req} = \frac{70}{3 \times 0.6} \times 1.2 \approx 186\% $$ 圣显之钥无充能属性,需通过沙漏+副词条补足: $$ 51.8\%(\text{充能沙}) + 6\times6.5\%(\text{副词条}) ≈ 90.8\% \Rightarrow \text{仍缺95.2%} $$ ➠ 必须搭配双水队友或西风系列武器 #### 3. **特效利用率** - 被动「沉入沙海的史诗」分两段: - **生命提升**:稳定生效,增伤与治疗量双重收益 - **全队精通辅助**:需芙宁娜E技能持续命中,对绽放/激化队伍有战略价值 --- ### 三、实战场景优劣分析 #### ✔️ **优势场景** - **那维莱特队伍**:生命加成强化芙宁娜增伤能力,同时触发板砖被动为那维提供240精通(精1) - **妮露绽放队**:双水共鸣+板砖被动实现全队「生命+精通」双强化 - **治疗形态**:高生命提升群体治疗量,$HPS_{max}$可达$\frac{6.84\%HP+813}{2.5s}$ #### ❌ **劣势场景** - **单水速切队**:严重依赖充电宝角色(如雷神/西风夜兰) - **短轴爆发队**:无法叠满被动层数(需E技能持续命中10次) --- ### 四、性价比决策梯度 | 优先级 | 适用玩家类型 | 收益说明 | |--------|---------------------------|------------------------------| | ★★★★☆ | 已有板砖+玩绽放/那维体系 | 实现「一武器两核心」战略配置 | | ★★☆☆☆ | 追求极致单体治疗量 | 生命收益超治疗套盾系列 | | ★☆☆☆☆ | 缺充能配置的深渊单通玩家 | 可能卡大招循环 | --- ### 五、替代方案对比 - **最佳替代**:绿剑(磐岩结绿)→ 44.1%暴击+40%生命,综合输出更稳定 - **四星优选**:狼牙→ 36.8%暴击+特效增伤,适合速切流 - **特殊功能**:船坞长剑→ 提升战技伤害,适配输出流派 --- 如果需要进一步分析具体配装方案或计算不同精炼等级收益,可提供更多战斗场景细节。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值