计算机体系结构知识(二)-gdb和args
gdb使用
- make clean
- make
- make gdb
- run
- 如果希望使用tui,可以采用layout src
我的代码中cmd_si采用if(args && *args != ‘\0’)检验参数的原因
if(args && *args != ‘\0’)
解释
args 检查:
args 是一个指向字符的指针 (char *)。
args 为 NULL 表示没有传递额外的参数。
if(args) 检查 args 是否为 NULL。如果 args 是 NULL,整个条件表达式为假,不会执行后续的 *args != ‘\0’ 检查。
*args 检查:
*args 是对 args 指针所指向的字符的解引用。
*args 为 \0 表示 args 指向的字符串是空的。
if(*args != ‘\0’) 检查 args 指向的字符串是否为空。
优点
安全性:先检查 args 是否为 NULL,避免在 args 为 NULL 时进行解引用操作,防止段错误(Segmentation Fault)。
完整性:确保 args 既不为 NULL 也不为空字符串。
if(*args != ‘\0’)
解释
直接解引用:
*args 直接解引用 args 指针。
如果 args 是 NULL,直接解引用会导致段错误(Segmentation Fault)。
缺点
不安全:如果 args 是 NULL,直接解引用 *args 会导致程序崩溃。
不完整:只检查字符串是否为空,但不检查 args 是否为 NULL。
示例代码
安全的版本
C
深色版本
static int cmd_si(char *args){
int n = 1; // 默认执行一条指令
if(args && *args != '\0'){ // 检查 args 是否为 NULL 且不为空字符串
n = atoi(args); // 将参数转换为整数
if (n <= 0) { // 检查参数是否有效
printf("Invalid number of instructions: %s\n", args);
return -1;
}
}
for(int i = 0; i < n; i++){ // 执行 n 条指令
cpu_exec(1);
}
return 0; // 返回成功
</