大きなコードに問題があるので、できる限り削減しました。実際、問題の解決策を見つけましたが、より良い解決策があるとほぼ確信しています。助けを求める。
悪いコードは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
typedef struct{
int a;
}my_struct;
void tab_add(my_struct** tab, int i){
*tab = (my_struct*)realloc(*tab, i+1); // Here's the realloc
printf("Adding struct number %d\n", i);
tab[i]->a = i*8; // Problem here, when accessing tab[i] the second time
printf("Struct added\n");
}
int main(void){
my_struct* tab = NULL;
tab_add(&tab, 0);
tab_add(&tab, 1);
tab_add(&tab, 2);
return 0;
}
出力は次のとおりです。
構造体番号0を追加 構造体 を追加 構造体番号1を追加
zsh : セグメンテーション違反 ./main
さて、問題を解決するコードは次のとおりです(ただし、役に立たない変数が作成されます...):
#include <stdio.h>
#include <stdlib.h>
typedef struct{
int a;
}my_struct;
void tab_add(my_struct** tab, int i){
*tab = (my_struct*)realloc(*tab, i+1);
printf("Adding struct number %d\n", i);
my_struct st; // Useless variable created
st.a = i*8;
(*tab)[i] = st;
printf("Struct added\n");
}
int main(void){
my_struct* tab = NULL;
tab_add(&tab, 0);
tab_add(&tab, 1);
tab_add(&tab, 2);
return 0;
}
その出力は正しいです:
構造体番号0を追加 構造体
を
追加 構造体番号1を追加 構造
体
を追加 構造体番号2を追加 構造体を
追加
読んでくれてありがとう :)