将函数指针复制到C中的内存块



我正在使用pthreads API实现线程库。我需要做的一件事是分配一个大小为32767字节的堆栈,然后将指向pthread_exit的函数指针放在堆栈的顶部,并将堆栈指针递减到该函数指针以下。

我想出的代码如下:

void *stackPointer = malloc(32767);
stackPointer += 32767;
stackPointer -= sizeof(&pthread_exit);
stackPointer = memcpy(stackPointer, pthread_exit, sizeof(&pthread_exit));

通过这种方式使用memcpy函数,我可以看出函数指针没有正确地放置在内存中。有没有其他方法可以让我处理这个问题(或者我应该使用的函数(?

编辑:修复了从开始堆栈指针位于顶部的代码

呈现的代码有很多可疑之处。其中包括

  • 用类型为void *的指针进行指针算术是不符合的
  • 您似乎正在丢弃指向动态分配的块的唯一指针,这使得以后解除分配该块变得很棘手(如果可能的话(;以及
  • 根据您打算如何使用它,您可能无法确保在堆栈上推送的值正确对齐

但这些都相对较小:一些编译器使用void指针算术来完成您想要的操作,您可能能够重新计算释放块所需的指针,并且可能不需要考虑对齐。

然而,

根据我的判断,通过这种方式使用memcpy函数,函数指针没有正确放置在内存中。

不,绝对不是。memcpy()函数将源指针指向的数据复制到目标指针指示的位置。您想要编写指针本身,这完全是另一回事。

有没有其他方法可以解决这个问题(或者我应该使用的函数(?

您可以将指针存储在变量中,然后从那里复制:

#define STACK_SIZE 32767
void (*pte)(void *) = pthread_exit;
void *stackLimit = malloc(STACK_SIZE);
void *stackBottom = stackLimit + STACK_SIZE;
void *stackPointer = (char *) stackBottom - sizeof(pte);
memcpy(stackPointer, pte, sizeof(pte));

或者,如果未对齐的访问不是问题(或者如果堆栈大小略大于或小于32767是可以的(,那么您可以通过简单的分配来完成:

void *stackLimit = malloc(STACK_SIZE);
void *stackBottom = stackLimit + STACK_SIZE;
typedef void (*pte_type)(void *);
((pte_type) stackBottom)[-1] = pthread_exit;
void *stackPointer = (pte_type) stackBottom - 1;

typedef是为了清晰易读。等效代码可以在没有的情况下编写。

请注意,函数类型的表达式(如pthread_exit,当该函数的声明在作用域中时(会自动转换为函数指针。你不需要在它们上使用&操作符,尽管这样做是无害的

最新更新