0

C一直是个谜!

我正在实现一个工作组线程执行模型,在该模型中我试图使用 alloca 作为更快的内存分配选项。在尝试通过使用 alloca 存储在堆栈中的函数指针执行代码时,我遇到了一个奇怪的分段错误。

这是一个导致类似分段错误的牙签代码:

#include <stdlib.h>
#include <stdio.h>

typedef void* (*foo)(void*);

typedef struct task
{
    foo f;
} task;

void *blah(void* v)
{
    printf("addr:%p\n", &v);
    return v;
}

int main()
{
    void *queue[10]; 

    task *t = (task*) alloca (sizeof(task));
    // No null check, excuse me!
    t->f = blah;

    queue[0] = (void*)t;
    char string[10] = "Bingo!";
    char *c = &string[0];

    task *tnew = (task*)&queue[0];
    tnew->f((void*)c);

    return 0; 
}

当我执行上述代码时,我在 tnew->f() 行出现分段错误。GDB 回溯对我没有多大帮助。

请解释上面代码中的错误。我是第一次使用alloca。

非常感谢你!

4

2 回答 2

7

更改此行:

task* tnew = (task*)&queue[0];

task* tnew = (task*)queue[0];

因为queue[0]已经是一个指针;您不需要获取它的地址。你里面有同样的问题blah。你printf不会崩溃,但它会打印出指针的地址,而不是指针的值,这可能不是你想要的。

于 2011-07-30T01:55:57.997 回答
0

也许您可能还想传递参数“v”?

t->f = blah; // BAD

t->f = blah (SOMETHING); // Better...
于 2011-07-30T02:06:47.587 回答