Странная ошибка печати массива структур в C

Привет всем У меня возникли проблемы с диагностикой причины ошибки при печати массива структур в C.

В отдельном заголовочном файле (назовите его header.h) У меня есть следующая структура typedef'd:

typedef struct instruction prog;

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

Для моей основной задачи по программированию я хочу прочитать из файла серию инструкций, состоящих из символа типа (переменная kind выше) и инструкция, состоящая из четырех целых чисел (перечислены как op выше). Примеры включают R 1004E 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'

Другие вопросы по тегам