Странная ошибка печати массива структур в C
Привет всем У меня возникли проблемы с диагностикой причины ошибки при печати массива структур в C.
В отдельном заголовочном файле (назовите его header.h
) У меня есть следующая структура typedef'd:
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
Причина, по которой это странно, в том, что идентичная арифметика указателей дала очень хорошие результаты с похожей структурой. Что тут происходит? Что мне не хватает?
2 ответа
Вы забыли дать место для строки, заканчивающейся нулевым. Исправьте вашу декларацию структуры следующим образом:
struct instruction{
char kind;
char op[5];
};
И это будет работать.
Вы также можете упростить объявление следующим образом:
typedef struct instruction{
char kind;
char op[5];
} prog;
Переполнение буфера на char op[4]
тогда Undefined_behavior
Чтобы иметь возможность хранить "1004"
это должно быть 5 bytes long
иметь место для NULL
терминатор.
struct instruction{
char kind;
char op[5];
};
Литеральная строка "1004"
является '1', '0', '0', '4', '\0'