C中奇怪的结构数组打印错误
Strange Struct Array Printing Error in C
嘿,我在诊断在 C 中打印结构数组时出错的原因时遇到了一些问题。
在一个单独的头文件中(称之为 header.h
)我有以下 typedef 结构:
typedef struct instruction prog;
struct instruction{
char kind;
char op[4];
};
对于我的主要编程任务,我想从文件中读取一系列应该由类型字符(上面的变量 kind
组成)和由四个整数组成的指令(列出如上 op
)。示例包括 R 1004
E 1008
等。我可以很好地读取数据,但它似乎存储不正确。我写了下面的测试代码,看看我是否能找到错误,但我仍然遇到同样的问题。我的目标是将这些存储为指令数组,其中使用下面代码的说法,mem[i].kind = 'R'
和 mem[i].op =
1004`。
#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++;
}
}
这给我的输出如下所示:
R 1004R1004R1004R1004R1004R1004R1004R1004R1004R1004
R 1004R1004R1004R1004R1004R1004R1004R1004R1004
R 1004R1004R1004R1004R1004R1004R1004R1004
R 1004R1004R1004R1004R1004R1004R1004
R 1004R1004R1004R1004R1004R1004
R 1004R1004R1004R1004R1004
R 1004R1004R1004R1004
R 1004R1004R1004
R 1004R1004
R 1004
这很奇怪的原因是相同的指针算法在类似的结构下给出了很好的结果。这里发生了什么?我错过了什么?
char op[4]
上的缓冲区溢出,然后 Undefined_behavior
为了能够存储 "1004"
它必须是 5 bytes long
才能有 space 作为 NULL
终止符。
struct instruction{
char kind;
char op[5];
};
文字串 "1004"
是 '1', '0', '0', '4', '[=16=]'
您忘记为以 null 结尾的字符串提供 space。
将您的结构声明修改为:
struct instruction{
char kind;
char op[5];
};
它会起作用。
您也可以这样简化声明:
typedef struct instruction{
char kind;
char op[5];
} prog;
嘿,我在诊断在 C 中打印结构数组时出错的原因时遇到了一些问题。
在一个单独的头文件中(称之为 header.h
)我有以下 typedef 结构:
typedef struct instruction prog;
struct instruction{
char kind;
char op[4];
};
对于我的主要编程任务,我想从文件中读取一系列应该由类型字符(上面的变量 kind
组成)和由四个整数组成的指令(列出如上 op
)。示例包括 R 1004
E 1008
等。我可以很好地读取数据,但它似乎存储不正确。我写了下面的测试代码,看看我是否能找到错误,但我仍然遇到同样的问题。我的目标是将这些存储为指令数组,其中使用下面代码的说法,mem[i].kind = 'R'
和 mem[i].op =
1004`。
#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++;
}
}
这给我的输出如下所示:
R 1004R1004R1004R1004R1004R1004R1004R1004R1004R1004
R 1004R1004R1004R1004R1004R1004R1004R1004R1004
R 1004R1004R1004R1004R1004R1004R1004R1004
R 1004R1004R1004R1004R1004R1004R1004
R 1004R1004R1004R1004R1004R1004
R 1004R1004R1004R1004R1004
R 1004R1004R1004R1004
R 1004R1004R1004
R 1004R1004
R 1004
这很奇怪的原因是相同的指针算法在类似的结构下给出了很好的结果。这里发生了什么?我错过了什么?
char op[4]
上的缓冲区溢出,然后 Undefined_behavior
为了能够存储 "1004"
它必须是 5 bytes long
才能有 space 作为 NULL
终止符。
struct instruction{
char kind;
char op[5];
};
文字串 "1004"
是 '1', '0', '0', '4', '[=16=]'
您忘记为以 null 结尾的字符串提供 space。 将您的结构声明修改为:
struct instruction{
char kind;
char op[5];
};
它会起作用。
您也可以这样简化声明:
typedef struct instruction{
char kind;
char op[5];
} prog;