嘿,我在诊断C中打印结构数组时出错的原因时遇到了一些麻烦。
在一个单独的头文件中(称之为header.h
)我有以下typedef结构:
typedef struct instruction prog;
struct instruction{
char kind;
char op[4];
};
对于我的主编程任务,我想从文件中读取一系列应该是由类型字符组成的指令(上面的变量kind
)和一个由四个整数组成的指令(列为{ {1}}以上)。示例包括op
R 1004
等。我可以很好地读取数据,但似乎存储的内容不正确。我编写了以下测试代码,看看是否能找到错误,但我仍然遇到同样的问题。我的目标是将这些存储为一系列指令,使用下面代码的说法E 1008
和mem[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++;
}
}
这很奇怪的原因是相同的指针算法给出了具有类似结构的精细结果。这里发生了什么?我错过了什么?
答案 0 :(得分:1)
char op[4]
上的缓冲区溢出,然后是Undefined_behavior
为了能够存储"1004"
,必须5 bytes long
为NULL
终结符留出空间。
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;