1

我正在为学校做一个项目,我已经设法通过对我的代码做一些非常笨拙的事情来解决这个问题。我有一个包含多个字段的结构,并且我正在尝试访问以下字段(因为它在名为 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", &current_event->number_of_couples);

并且在到达我的代码之前被程序至少引用了三次(其中存储了一个有效的 int 值)。请记住,第二位有效,因此它肯定已初始化。

4

4 回答 4

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;

然后,您可以像第一个示例一样分配内存。

于 2013-02-03T12:02:23.663 回答
1

您不应该在指针中存储整数值。指针用于指向事物,您应该很少需要将指针转换为整数类型。如果你这样做,你应该使用uintptr_torintptr_t类型。

您应该取消引用指针(假设它指向一个有效的int)或更改的类型number_of_couples,使其不是指针。如果将其保留为指针,则必须int在尝试取消引用它之前确保它指向有效对象,但根据您的用法和上面的上下文,它不需要是指针。

于 2013-02-03T12:06:12.177 回答
0

您应该使用 *(current_event->number_of_couples),这样您将获得指针指向的值。如果你不使用 * 你会得到一个可以转换为 int 的指针地址,但这不是你想要的。尝试在 current_event->number_of_couples 周围的代码中加上括号,然后使用 *. 如果它没有帮助,那么其他东西会导致崩溃。

于 2013-02-03T12:04:32.233 回答
0

如果取消引用此指针时代码崩溃,则很可能是它指向无效或未初始化的内存。你没有在你的问题中指出它在哪里被初始化,但是取消引用一个未初始化的指针是在自找麻烦 - 查看它在哪里被初始化以及它是否指向动态内存。

于 2013-02-03T12:07:41.797 回答