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);
//我在这里收到一个令人讨厌的警告,但我该如何照顾
答案 0 :(得分: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
来电的返回值。
答案 1 :(得分:1)
(abc_t *) malloc(5*sizeof(abc_t *));
应为(abc_t *) malloc(5*sizeof(abc_t));
。你要求的是5个指针的空间而不是5个结构的空间。
答案 2 :(得分: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
}
注意:我也删除了不需要且有潜在危险的演员表。
另请注意,此风格更正将修复两者错误。