我正在为一所学校的项目工作,我已经设法通过做一些非常笨重的代码来解决问题。我有一个包含多个字段的结构,我正在尝试访问以下字段(因为它在名为current_event的结构中声明)。
int *number_of_couples;
然后进入程序我调用这个值,这样我就可以根据这个* number_of_couples字段动态分配一个数组。基本上我试图将其用作“长度”运算符,因为C没有(好)解决方案。
在我尝试实现以下代码之前:
int *permutable_array;
permutable_array = malloc((current_event->number_of_couples) * sizeof(int)); //Line 91
if(permutable_array == NULL){
panic("permutable_array"); //Ensures that Malloc was successful.
}
反过来会抛出以下错误: 第91行:错误:无效操作数到二进制*(有'int *'和'unsigned int')
我做了一个非常草率的工作,因为在这一点上我只想让程序工作(纯编程的第三小时!摇滚!)。所以我实施了:
int *permutable_array;
int avoid_my_bug = (int) current_event->number_of_couples;
permutable_array = malloc(avoid_my_bug * sizeof(int));
if(permutable_array == NULL){
panic("permutable_array");
}
哪个有效。现在我有点理解它告诉我的错误。我怀疑这与我将number_of_couples的值存储为current_event中的指针这一事实有关,这也是一个指针。所以如果number_of_couples的值是4,那么程序获得该值的路径是:
ptr_to_current_event -> ptr_to_number_of_couples -> 4
我可以使用我的草率解决方案,但很明显,我这样做是为了避免错误。我宁愿知道为什么代码不会编译。我也尝试过:
permutable_array = malloc((*current_event->number_of_couples) * sizeof(int)); //Line 91
应该取消引用current_event-> number_of_couples返回的指针,但它会崩溃。任何解决方案?
*的 修改 * 它由以下代码行初始化:
fscanf(input_file, "%i", ¤t_event->number_of_couples);
并且在到达我的代码之前,程序至少引用了三次(其中存储了一个有效的int值)。请记住,第二位有效,因此它肯定是初始化的。
答案 0 :(得分:1)
您必须取消引用指向int
的指针*(current_event->number_of_couples) * sizeof(int)
将指针强制转换为int,会将number_of_couples的地址作为整数。例如,这可能是一些任意大的数字,如0xf97e1892。
崩溃可能是number_of_couples
未初始化的结果。您必须为此指针分配内存。如果没有初始化,它将指向任意位置。
如果使用整数number_of_couples = 5
初始化它,则会指向无效的内存。只有从堆中分配内存或指向另一个整数变量时,指针才有效。
总而言之,在您的情况下,最好将number_of_couples
定义为int并避免所有潜在的陷阱。
int number_of_couples;
然后,您可以像在第一个示例中那样分配内存。
答案 1 :(得分:1)
您不应该在指针中存储整数值。指针指向事物,你应该很少需要将指针转换为整数类型。如果您这样做,则应使用uintptr_t
或intptr_t
类型。
您应该取消引用指针(假设它指向有效的int
)或更改number_of_couples
的类型,使其不是指针。如果将其保留为指针,则必须确保它在尝试取消引用之前指向有效的int
对象,但根据上面的用法和上下文,它不需要是指针。
答案 2 :(得分:0)
你应该使用*(current_event-> number_of_couples),这样你就可以得到指针指向的值。如果您不使用*,您将获得一个指针的地址,您可以将其转换为int,但这不是您想要的。 尝试将括号放在current_event-> number_of_couples周围的代码中,然后使用*。如果它没有帮助,那么其他东西会导致崩溃。
答案 3 :(得分:0)
如果在取消引用此指针时代码崩溃,则可能是指向无效或未初始化的内存。你没有在你的问题中指出它被初始化的地方,但取消引用一个未初始化的指针就是在寻找麻烦 - 看看它初始化的位置以及是否指向动态内存。