【发布时间】:2020-10-04 16:30:56
【问题描述】:
我正在使用 pthreads API 实现一个线程库。我需要做的一件事是分配一个大小为 32767 字节的堆栈,然后将指向 pthread_exit 的函数指针放在堆栈的顶部,并将堆栈指针递减到该函数指针的下方。
我想出的代码如下:
void *stackPointer = malloc(32767);
stackPointer += 32767;
stackPointer -= sizeof(&pthread_exit);
stackPointer = memcpy(stackPointer, pthread_exit, sizeof(&pthread_exit));
据我所知,通过以这种方式使用 memcpy 函数,函数指针未正确放置在内存中。还有其他方法我应该解决这个问题(或我应该使用的功能)吗?
编辑: 修复代码从一开始就在顶部有堆栈指针
【问题讨论】:
-
大小奇数。我认为你需要重新考虑它。你需要了解堆栈是如何工作的。回答你的问题记忆是 100% 没问题的。
-
这在很多方面都是错误的。首先,您增加了
sizeof(void (*stackPointer)(void))squared 字节。其次,正如您所说,堆栈在您的架构上向下增长,因此您应该从 top 开始并递减,第三,32767看起来指针很奇怪,第四,你不能修改 malloc 返回的指针,否则你将如何释放内存,第四,你确定堆栈指针位置即使在那时也是正确的...... -
memcpy复制指向的数据,而不是指针本身,但我认为您真正想要编写的是后者。 -
您确定要堆栈指针指向 below 顶部元素,而不是 at 吗?如果是这样,那么下面有多少字节,1?对于向下增长的堆栈,我的第一个猜测是堆栈指针将指向顶部元素,因此当您想要压入一个值时,您将指针递减该值的大小以找到正确的地址(并且那么写入值后就不需要再调整了。
标签: c stack pthreads posix function-pointers