(C)指针不正确评估解引用运算符

时间:2013-02-03 11:59:28

标签: c pointers dynamic

我正在为一所学校的项目工作,我已经设法通过做一些非常笨重的代码来解决问题。我有一个包含多个字段的结构,我正在尝试访问以下字段(因为它在名为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 个答案:

答案 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_tintptr_t类型。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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