C中奇怪的结构阵列打印错误

时间:2016-02-24 16:48:18

标签: c pointers struct parameter-passing pointer-arithmetic

嘿,我在诊断C中打印结构数组时出错的原因时遇到了一些麻烦。

在一个单独的头文件中(称之为header.h)我有以下typedef结构:

typedef struct instruction prog;

struct instruction{
char kind;
char op[4];
};

对于我的主编程任务,我想从文件中读取一系列应该是由类型字符组成的指令(上面的变量kind)和一个由四个整数组成的指令(列为{ {1}}以上)。示例包括op R 1004等。我可以很好地读取数据,但似乎存储的内容不正确。我编写了以下测试代码,看看是否能找到错误,但我仍然遇到同样的问题。我的目标是将这些存储为一系列指令,使用下面代码的说法E 1008mem[i].kind = 'R' 1004`。

mem[i].op =

这给了我看起来像这样的输出:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <stdbool.h>
#include "header.h"

void memFill(prog *P, int x);
void memPrint(prog *P, int x);

int main(){
    prog mem[10];

    memFill(&mem[0], 10);
    memPrint(&mem[0], 10);
return 0;
}


void memFill(prog *P, int x){
char *v = "1004";
for(int i = 0; i< x; i++){
    P->kind = 'R';
    strcpy(P->op, v);
    P++;
}
}


void memPrint(prog *P, int x){
for(int i = 0; i <x; i++){
    printf("%c %s\n",P->kind, P->op);
    P++;
}
}

这很奇怪的原因是相同的指针算法给出了具有类似结构的精细结果。这里发生了什么?我错过了什么?

2 个答案:

答案 0 :(得分:1)

char op[4]上的缓冲区溢出,然后是Undefined_behavior

为了能够存储"1004",必须5 bytes longNULL终结符留出空间。

struct instruction{
char kind;
char op[5];
};

文字字符串"1004"'1', '0', '0', '4', '\0'

答案 1 :(得分:0)

您忘了为字符串结尾null提供空间。 修复你的struct声明:

struct instruction{
char kind;
char op[5];
};

它会起作用。
您也可以通过这种方式简化声明:

typedef struct instruction{
char kind;
char op[5];
} prog;