gpt4 book ai didi

无法找出段错误

转载 作者:行者123 更新时间:2023-11-30 17:12:07 25 4
gpt4 key购买 nike

我无法找出段错误的根源。我已将其范围缩小到函数和代码片段,但我很困惑。介意看一下吗?

附注我请求你们不要对反对票太严厉。我是一名学生,我一边学习一边简单地自学。更不用说我在c 中操作字符串是一件痛苦的事情,所以我知道我的代码看起来很糟糕。但让我休息一下。这就是我来这里学习的原因。

无论如何,请让我知道您还需要什么,并提前致谢。

这是控制台输出。

   rpf0024@cse02:~/cse2610$ gcc -std=gnu99 main.c
rpf0024@cse02:~/cse2610$ ./a.out

# A demonstration of some simple MIPS instructions
Loop: sll $t1, $s3,
add $t1, $t1, $s6
lw $t0, 0($t1)
bne $t0, $s5, Exit
addi $s3, $s3, 1
j Loop
Exit:

Line: 0 #
Line: 1
Line: 2 Loop
Line: 3 add
Line: 4 lw
Line: 5 bne
Line: 6 addi
Line: 7 j
Line: 8 Exit
WompWompWompSplitting string:

add
$t1
$t1
$s6
Segmentation fault (core dumped)
rpf0024@cse02:~/cse2610$

Assem.c - 我已验证段错误位于我的一批“if”语句中的某个位置。我删除了整个代码块,我的程序运行得很好。

int checkRformat(char *LineArray, struct assem item)
{
int i = 0;
char *str;
char *temp;
item.opcode = NULL;
item.shamt = NULL;
item.funct = NULL;
item.rs = NULL;
item.rt = NULL;
item.rd = NULL;

printf("Splitting string:\n");
temp = strdup(LineArray);
str = strtok(temp, " ,.-#\n\t");
//this helper function gets called by another.It primarily serves to convert the MIPS code
//instructions or labels into their binary values. These global variables will then concatenated
// and be printed onto a .txt file.
while(str != NULL)
{
printf("%s\n", str);
str = strtok(NULL, " ,.-#\n\t");

if(strcmp(str, "add"))
{
item.opcode = "000000";
item.shamt = "00000";
item.funct = "10100";
}
else if(strcmp(str, "$t0"))
{
if(strcmp(item.rs, NULL)){item.rs = "01000";}
else if(item.rt, NULL){item.rt = "01000";}
else if(item.rd,NULL){item.rd = "01000";}
}
else if(strcmp(str, "$t1"))
{
if(strcmp(item.rs,NULL)){item.rs = "01001";}
else if(item.rt,NULL){item.rt = "01001";}
else if(item.rd,NULL){item.rd = "01001";}
}
else if(strcmp(str, "$s6"))
{
if(strcmp(item.rs,NULL)){item.rs = "11110";}
else if(item.rt,NULL){item.rt = "11110";}
else if(item.rd,NULL){item.rd = "11110";}
}
}
}

assem.h

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

struct assem
{
char myString[101]; //buffer
char *myLines[20]; //this will store the lines from a text file..up to 20 lines
char *myLines2[20];
char *myWord[20]; //this stores the 1st words individually.
char *opcode;
char *rs;
char *rt;
char *rd;
char *shamt;
char *funct;
char counter; //counter for number of lines
//printing stuff...prints file directly from whats STORED IN THE ARRAY
};

int readFile(FILE *FileToBeRead, struct assem *item); //takes in the file that needs to be read and splits it into lines
int firstCheck(struct assem item);
int secondCheck(struct assem item);
int checkRformat(char *LineArray, struct assem item);
int checkFormat1(char *LineArray,struct assem item, int offset);
int checkFormat2(char *LineArray, struct assem item, int offset);
int checkFormat3(char *LineArray, struct assem item, int offset);
int checkFormat4(char *LineArray, struct assem item, int offset);
int checkFormat5(char *LineArray, struct assem item, int offset);
int checkFormat6(char *LineArray, struct assem item);
int checkFormat7(char *LineArray, struct assem item);
int checkLabel1(char *Array, struct assem item);
int checkLabel2(char *Array, struct assem item);
int checkLabel3(char *Array, struct assem item);
//int checkSyntax1(char *LineArray, struct assem item);
void removeSpaces(char* str_trimmed, const char* str_untrimmed, struct assem *item); //HELPER FUNCTIONS TO REMOVE SPACES
void ReadWords(struct assem *item); //stores the first word of each line in an array for evaluation
void printFile(struct assem item); //prints some stuff
void printWords(struct assem item); //checks the first character if its instruction, label, or comment

最佳答案

如果 strtok() 返回 NULL,则需要跳出循环。在返回循环顶部的 while 测试之前,您不会进行检查。但这已经太晚了,因为 strtok() 之后的代码尝试使用 str

str = strtok(NULL, " ,.-#\n\t");
if (!str) {
break;
}

关于无法找出段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31797139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com