Как использовать alloca для выделения указателей на функции C? - PullRequest
0 голосов
/ 30 июля 2011

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.

Большое спасибо!

Ответы [ 2 ]

7 голосов
/ 30 июля 2011

Изменить эту строку:

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

до

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

Потому что queue[0] уже указатель; вам не нужно брать адрес этого. У вас та же проблема внутри blah. Ваш printf не будет аварийно завершать работу, но он напечатает адрес указателя, а не значение указателя, что, вероятно, не то, что вам нужно.

0 голосов
/ 30 июля 2011

Может быть, вы также захотите передать параметр "v"?

t->f = blah; // BAD

t->f = blah (SOMETHING); // Better...
...