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 に答える