遍历转换为 void* 的数组
Iterating over an array cast as void*
我创建了一个数组:
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 位置的重复模式。
我显然越过了一些内存边界,这里发生了什么,我该如何解决?
变化:
(void*)&array
对此:
(void*)array
因为 void* findMax(void* arg)
需要一个指针,而您传递的是指针的地址。
指针变量是用派生类型说明符声明的变量。
它仍然是一个变量,它仍然有一个地址。
该地址上的值是该类型变量的地址。
A "pointer type" 通常指向 void*
而短指针指向 short*
等等。 void 指针可以指向任何变量,但是在使用它时,您必须将其转换为泛型指针,使用类型转换,
因此,当你将它转换为其他东西时,你只投 void* 。
因此,如果您将 & 符号(引用)运算符添加到指针 &ptr
,您最终将引用指针变量的地址。如果您想 "repoint" 从函数内部获取指针,它会很有用。
您的代码仍然可以成功,但您必须以不同的方式声明参数:
(foo(void** vp)
)
要访问它指向的变量,您可以取消引用 void**:
void* p = *vp;
我创建了一个数组:
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 位置的重复模式。
我显然越过了一些内存边界,这里发生了什么,我该如何解决?
变化:
(void*)&array
对此:
(void*)array
因为 void* findMax(void* arg)
需要一个指针,而您传递的是指针的地址。
指针变量是用派生类型说明符声明的变量。 它仍然是一个变量,它仍然有一个地址。 该地址上的值是该类型变量的地址。
A "pointer type" 通常指向 void*
而短指针指向 short*
等等。 void 指针可以指向任何变量,但是在使用它时,您必须将其转换为泛型指针,使用类型转换,
因此,当你将它转换为其他东西时,你只投 void* 。
因此,如果您将 & 符号(引用)运算符添加到指针 &ptr
,您最终将引用指针变量的地址。如果您想 "repoint" 从函数内部获取指针,它会很有用。
您的代码仍然可以成功,但您必须以不同的方式声明参数:
(foo(void** vp)
)
要访问它指向的变量,您可以取消引用 void**:
void* p = *vp;