残念です。
boxさん、みけCATさん、ご指摘ありがとうございます。
みけCATさんの
「a[0]とa[0][0]~a[0][m-1]」というご指摘を参考に、
(結構複雑になりましたが)このようなコードを書いてみたところ、
コード:
#include "stdio.h"
#include"Share.h"
#include"stdlib.h"
#include "DxLib.h"
void load(char ***a, char ***b, int ***c, int ***d);
int main(void)
{
int k;
char **a[1], **b[1];
int **c[1], **d[1];
load(a, b, c, d);
printf("%s\n", a[0][0]);
printf("%s\n", b[0][0]);
printf("%s\n", b[0][1]);
printf("%s\n", b[0][2]);
free(a[0]);
free(a[0][0]);
free(b[0]);
free(b[0][0]);
free(b[0][1]);
free(b[0][2]);
free(c[0]);
free(c[0][0]);
free(c[0][1]);
free(c[0][2]);
free(d[0]);
free(d[0][0]);
return 0;
}
void load(char ***a, char ***b, int ***c, int ***d){
FILE *fp;
char st[1024];
int j = 0, m = 0, k = 0, n = 0, n1 = 0, n2 = 0, n3 = 0, n0 = 0;
int v[4] = { 0, 0, 0, 0 };
fp = fopen("loadk.txt", "r");
fscanf_s(fp, "%d", &m);
for (j = 0; j < m; j++){
fscanf_s(fp, "%d", &k);
if (k == 0){
fscanf_s(fp, "%s", st, 20);
if (n == 0){
a[n] = (char**)malloc(sizeof(char*));
}
(*a)[n] = (char*)malloc(sizeof(char)*(strlen(st) + 1));
strcpy((*a)[n], st);
int h0 = 0, h1 = 0;
fscanf_s(fp, "%d", &h0);
if (n3 == 0){
d[n3] = (int**)malloc(sizeof(int*));
}
(*d)[n3] = (int*)malloc(sizeof(int)*(h0));
for (h1 = 0; h1 < h0; h1++){
fscanf_s(fp, "%d", (**d + h0));
}
n++;
n3++;
}
else{
fscanf_s(fp, "%s", st, 20);
if (n1 == 0){
b[n1] = (char**)malloc(sizeof(char*));
}
(*b)[n1] = (char*)malloc(sizeof(char)*(strlen(st) + 1));
strcpy((*b)[n1], st);
if (n2 == 0){
c[n2] = (int**)malloc(sizeof(int*));
}
(*c)[n2] = (int*)malloc(sizeof(int)*(4));
for (n0 = 0; n0 < 4; n0++){
fscanf_s(fp, "%d", (**c + n0));
}
n1++;
n2++;
}
}
fclose(fp);
}
free(a[0][0]);のところでアクセス違反がおき、
freeの順序を変え、このようにしたときは、
コード:
#include "stdio.h"
#include"Share.h"
#include"stdlib.h"
#include "DxLib.h"
void load(char ***a, char ***b, int ***c, int ***d);
int tofree[4];
int main(void)
{
int k;
char **a[1], **b[1];
int **c[1], **d[1];
load(a, b, c, d);
printf("%s\n", a[0][0]);
printf("%s\n", b[0][0]);
printf("%s\n", b[0][1]);
printf("%s\n", b[0][2]);
free(a[0]);
free(b[0]);
free(c[0]);
free(d[0]);
for (k = 0; k < tofree[0] + 1; k++){
free(a[0][k]);
}
for (k = 0; k < tofree[1] + 1; k++){
free(b[0][k]);
}
for (k = 0; k < tofree[2] + 1; k++){
free(c[0][k]);
}
for (k = 0; k < tofree[3] + 1; k++){
free(d[0][k]);
}
return 0;
}
void load(char ***a, char ***b, int ***c, int ***d){
FILE *fp;
char st[1024];
int j = 0, m = 0, k = 0, n = 0, n1 = 0, n2 = 0, n3 = 0, n0 = 0;
int v[4] = { 0, 0, 0, 0 };
fp = fopen("loadk.txt", "r");
fscanf_s(fp, "%d", &m);
for (j = 0; j < m; j++){
fscanf_s(fp, "%d", &k);
if (k == 0){
fscanf_s(fp, "%s", st, 20);
if (n == 0){
a[n] = (char**)malloc(sizeof(char*));
}
(*a)[n] = (char*)malloc(sizeof(char)*(strlen(st) + 1));
strcpy((*a)[n], st);
int h0 = 0, h1 = 0;
fscanf_s(fp, "%d", &h0);
if (n3 == 0){
d[n3] = (int**)malloc(sizeof(int*));
}
(*d)[n3] = (int*)malloc(sizeof(int)*(h0));
for (h1 = 0; h1 < h0; h1++){
fscanf_s(fp, "%d", (**d + h0));
}
n++;
n3++;
}
else{
fscanf_s(fp, "%s", st, 20);
if (n1 == 0){
b[n1] = (char**)malloc(sizeof(char*));
}
(*b)[n1] = (char*)malloc(sizeof(char)*(strlen(st) + 1));
strcpy((*b)[n1], st);
if (n2 == 0){
c[n2] = (int**)malloc(sizeof(int*));
}
(*c)[n2] = (int*)malloc(sizeof(int)*(4));
for (n0 = 0; n0 < 4; n0++){
fscanf_s(fp, "%d", (**c + n0));
}
n1++;
n2++;
}
}
tofree[0] = n;
tofree[1] = n1;
tofree[2] = n2;
tofree[3] = n3;
fclose(fp);
}
ブレークポイントが発生した、と表示されました。
解決策及びなぜこうなるのかがわかる方、できればですがご教授くだされば嬉しいです。