0
typedef struct abc {
  unsigned int pref;
  unsigned int port;
  char *aRecordIp;
    int index;
    int count;
}abc_t;

typedef struct xyz {
        abc_t *ab;
        int index;
        int count;
}xyz_t;


int Lookup (char *lookup,xyz_t **handle) {

*handle = (xyz_t *)malloc(sizeof(xyz_t *));
(*handle)->ab = (abc_t *) malloc(5*sizeof(abc_t *));
//
(*handle)->ab[0].pref = 10;  //seg fault here
}


void *myhandle; 

// 这是一个空指针,我无法更改它,因为它也在其他地方使用

char lookup;


Lookup(&lookup, &myhandle);

// 我在这里收到一个很明显的警告,但我该如何处理

4

3 回答 3

1
(*handle)->ab = (abc_t *) malloc(5*sizeof(abc_t *));

应该是:

(*handle)->ab = (abc_t *) malloc(5*sizeof(abc_t));

在 C 中你不需要那个转换,因为void*隐式转换为任何类型的指针,所以:

(*handle)->ab = malloc(5*sizeof(abc_t));

足够的。

此外,请确保检查所有malloc调用的返回值。

于 2013-09-11T15:58:39.727 回答
1

(abc_t *) malloc(5*sizeof(abc_t *));应该是(abc_t *) malloc(5*sizeof(abc_t));。您正在请求 5 个指针的空间,而不是 5 个结构的空间。

于 2013-09-11T15:58:52.627 回答
1

该错误是选择该ptr = malloc (count * sizeof *ptr);符号的一个很好的理由;编译器已经知道表达式的类型和大小,因此您不必再次指定

int Lookup (char *lookup,xyz_t **handle) {

  *handle = malloc(sizeof **handle);
  (*handle)->ab = malloc(5 * sizeof *(*handle)->ab );
  (*handle)->ab[0].pref = 10;  //seg fault here
}

或者,使用数组表示法(只是为了避免丑陋*(*handle)):

int Lookup (char *lookup,xyz_t **handle) {

  *handle = malloc(sizeof **handle);
  (*handle)->ab = malloc(5 * sizeof (*handle)->ab[0] );
  (*handle)->ab[0].pref = 10;  //seg fault here
}

注意:我还移除了不需要且具有潜在危险的铸件。

另请注意,这种风格更正将修复这两个错误。

于 2013-09-11T16:23:44.707 回答