diff --git a/src/engine/engine_io.c b/src/engine/engine_io.c
index 087d22b1..e0fb7372 100644
--- a/src/engine/engine_io.c
+++ b/src/engine/engine_io.c
@@ -1283,6 +1283,7 @@ static void _resetData(const mjModel* m, mjData* d, unsigned char debug_value) {
d->ne = 0;
d->nf = 0;
d->nefc = 0;
+ d->nnzJ = 0;
d->ncon = 0;
// clear global properties
diff --git a/test/engine/engine_io_test.cc b/test/engine/engine_io_test.cc
index 9517097d..c7a750f9 100644
--- a/test/engine/engine_io_test.cc
+++ b/test/engine/engine_io_test.cc
@@ -203,6 +203,27 @@ TEST_F(EngineIoTest, MakeDataReturnsNullOnFailure) {
mj_deleteModel(model);
}
+TEST_F(EngineIoTest, ResetVariableSizes) {
+ constexpr char xml[] = "";
+
+ std::array error;
+ mjModel* model = LoadModelFromString(xml, error.data(), error.size());
+ ASSERT_THAT(model, NotNull()) << "Failed to load model: " << error.data();
+
+ mjData* data = mj_makeData(model);
+ ASSERT_THAT(model, NotNull()) << "Failed to create mjData";
+
+ // don't call mj_forward, vars should be reset
+ EXPECT_EQ(data->ne, 0);
+ EXPECT_EQ(data->nf, 0);
+ EXPECT_EQ(data->nefc, 0);
+ EXPECT_EQ(data->nnzJ, 0);
+ EXPECT_EQ(data->ncon, 0);
+
+ mj_deleteData(data);
+ mj_deleteModel(model);
+}
+
using ValidateReferencesTest = MujocoTest;
TEST_F(ValidateReferencesTest, BodyReferences) {