1

大きなコードに問題があるので、できる限り削減しました。実際、問題の解決策を見つけましたが、より良い解決策があるとほぼ確信しています。助けを求める。

悪いコードは次のとおりです。

#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を追加 構造体を
追加

読んでくれてありがとう :)

4

4 に答える 4

2

使用する必要があります

(*tab)[i].a = i*8;

フィールドにアクセスするa

于 2012-10-08T16:44:15.877 に答える
1

reallocのマニュアル ページを参照してください。2 番目の引数は、割り当てたいデータのサイズです。代わりに配列インデックスを渡していると思います。

コードは理想的には次の形式である必要があります

my_struct* tmp = realloc(*tab, sizeof(my_struct) * (i+1));
if (tmp == NULL) {
    /* error handling goes here */
else {
    *tab = tmp;
}

realloc が失敗して NULL を返すことに対処するため。

于 2012-10-08T16:45:07.510 に答える
1

この割り当てを行うのと同じくらい簡単です。

(*tab)[i].a = i*8;

stを取り除きたい場合。

于 2012-10-08T16:46:31.253 に答える
0

ここで何を達成しようとしているのかわからない。reallocのドキュメントによると、可能であれば割り当てられたスペースのサイズを大きくしようとしますが、そうでない場合は、freeとmallocのようになります。したがって、あなたの場合、構造体にスペースを割り当てようとすると、毎回同じになります。しかし、コードによると、最初は0バイトであり、解放しようとします(割り当てられたメモリは存在せず、セグメンテーション違反も同様です)。

また、あなたが言うことは修正ではないようです。それはまだ後である時点で死ぬでしょう。スタックは最初の呼び出しですでに破損しているためです。

于 2012-10-08T16:57:11.990 に答える