C字符串中的索引

C字符串中的索引,c,pointers,char,c-strings,C,Pointers,Char,C Strings,我在学校的任务是创建一个汇编程序(将汇编翻译成机器语言)和一个模拟器(将机器语言翻译成汇编语言指令)。我的一个问题是C字符串。我将粘贴相关代码,但我设法加载了一个能够容纳33个字符的字符数组(32个用于位,一个用于空终止符)。我已经成功地将机器语言翻译成正确的32位指令。然而,当我尝试索引字符数组的某些位时,它会给我带来分段错误,这让我感到困惑。我没有包括所有的代码,但当我试图确定是否有add操作码时,麻烦的部分在for循环中。考虑其他事情要做的适当和测试。谢谢 typedef struct s

我在学校的任务是创建一个汇编程序(将汇编翻译成机器语言)和一个模拟器(将机器语言翻译成汇编语言指令)。我的一个问题是C字符串。我将粘贴相关代码,但我设法加载了一个能够容纳33个字符的字符数组(32个用于位,一个用于空终止符)。我已经成功地将机器语言翻译成正确的32位指令。然而,当我尝试索引字符数组的某些位时,它会给我带来分段错误,这让我感到困惑。我没有包括所有的代码,但当我试图确定是否有add操作码时,麻烦的部分在for循环中。考虑其他事情要做的适当和测试。谢谢

typedef struct stateStruct {
    int pc;
    int mem[NUMMEMORY];
    int reg[NUMREGS];
    int numMemory;
 } stateType;


char line[MAXLINELENGTH];
char instruction[33];
stateType state;
state.pc=0;
FILE *filePtr;

int i;
int reg1,reg2;

for(i=state.pc;i<state.numMemory;i++){

    //noop
    if(state.mem[state.pc]==29360128){

    }
    //halt
    if(state.mem[state.pc]==25165824){

    }

    if(decimalToBinary(state.mem[state.pc],instruction)){
        //add instruction
        printf("%s\n",instruction);//This prints out a 32 bit string of 0 and 1
        if(instruction[7]==0 && instruction[8]==0 && instruction[9]==0){
            printf("add instruction");
            //Search for the first register 
            reg1=registerValue(instruction+10);
            printf("%d\n",reg1);
            //Search for the second register
            reg2=registerValue(instruction+13);
            printf("%d\n",reg2);
        }

    }
    else{
        exit(1);
    }
    state.pc++;
}



return(0);
}


int decimalToBinary(int decimal,char *instruction){

int i;
char binary[33];
int temp;
int x=0;

for(i=31;i>=0;i--){
    temp=pow(2,i);
    if(decimal%temp == decimal){
        binary[x]='0';
    }
    else{
        binary[x]='1';
        decimal=decimal%temp;
    }
    x++;
}   
strncpy(instruction,binary,32);
}

int registerValue(char *instruction){
int reg=0;
int i=2;
while(i>=0){
    if(*instruction=='1'){
        reg=reg+pow(2,i);
    }
    instruction++;
    i--;
}
return reg;
}
typedef struct stateststruct{
int pc;
int mem[数值];
int reg[NUMREGS];
国际货币基金组织;
}状态类型;
字符行[MAXLINELENGTH];
字符指令[33];
状态类型状态;
state.pc=0;
文件*filePtr;
int i;
int reg1,reg2;
对于(i=state.pc;i=0;i--){
温度=功率(2,i);
如果(十进制%temp==十进制){
二进制[x]='0';
}
否则{
二进制[x]='1';
十进制=十进制%温度;
}
x++;
}   
strncpy(指令,二进制,32);
}
int寄存器值(字符*指令){
int reg=0;
int i=2;
而(i>=0){
如果(*指令=='1'){
reg=reg+pow(2,i);
}
指令++;
我--;
}
返回注册表;
}

您是否初始化了“state.nummery”?我不认为它在任何地方,但你是循环,直到iya state.numMemory已初始化,所有内容都已正确初始化,当i printf指令时,它将打印出正确的32位代码。当我试图从
strncpy
手册页索引指令时,它有一个问题:警告:如果
src
的第一个
n
字节中没有空字节,则放置在
dest
中的字符串将不会以空结尾。因此,检查strncpy(指令,二进制,32)能否打印出“state.mem[state.pc]”作为“decimal”参数传递给“int decimalToBinary(int decimal,char*instruction)”?是否在
gdb
或其他调试器中运行它?编制索引时,
指令
的值是多少?