【问题标题】:Iterating over an array cast as void*遍历转换为 void* 的数组
【发布时间】:2018-11-27 08:10:03
【问题描述】:

我创建一个数组:

unsigned short* array = malloc(sizeof(unsigned short)*N);

给它赋值:

for(i=0; i<N; i++){
    array[i] = rand()%USHRT_MAX;
}

将其转换为 void* 并将其传递给工作线程,该线程将在数组中找到最大值:

pthread_create(&threads[0], NULL, findMax, (void*)&array);

看起来像这样:

void* findMax(void* arg){
    int i = 0;
    unsigned short max = 0;
    unsigned short* table = (unsigned short*)arg;
    for(i=0;i<N;i++){
        if(table[i]> max){
            max = table[i];
        }
    }
    printf("Max: %d\n", max);
}

问题在于数组中分配的数字格式错误。例如 N 个随机生成的数字:3664 50980 37495 12215 33721,此循环将解释为以下数字:

table[0] = 28680
table[1] = 2506
table[2] = 5
table[3] = 0
table[4] = 32736

以 5 和 0 作为数组中第 2 和第 3 位的重复模式。

我显然超出了一些内存界限,这里发生了什么,我该如何解决?

【问题讨论】:

  • 当你在pthread_create中传递参数时,变量已经是一个指针,所以你应该传递(void*)array

标签: c casting void-pointers


【解决方案1】:

变化:

(void*)&array

到这里:

(void*)array

因为void* findMax(void* arg) 需要一个指针,而您传递的是指针的地址。

【讨论】:

  • 而且你甚至不需要投射。
【解决方案2】:

指针变量是使用派生类型说明符声明的变量。 它仍然是一个变量,它仍然有一个地址。 该地址上的值是该类型变量的地址。

“指针类型”通常指的是void*,而短指针指向short* 等等。 void 指针可以指向任何变量,但是您必须将其转换为泛型类型的指针,使用它时,使用类型转换, 因此,只有在将其转换为其他内容时才使用 void*。

因此,如果您将与(引用)运算符添加到指针&amp;ptr,您最终将引用指针变量的地址。如果您想从函数中“重新指向”指针,它会很有用。

您的代码仍然可以成功,但您必须以不同的方式声明参数:

(foo(void** vp)) 要访问它指向的变量,您可以取消引用 void**:

void* p = *vp;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-13
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    相关资源
    最近更新 更多