pycuda 内核函数中定义指针与开辟空间出错

初学pycuda,内核部分定义了两个函数,其中第一个函数被第二个调用。我尝试在第一个函数中新定义指针q并开辟空间,最后返回q。显示错误“pycuda._driver.LogicError: cuCtxSynchronize failed: an illegal memory access was encountered”

__device__ float* fun1(float *p, int m){
    float *q = (float *)malloc(m * sizeof(float));               
    ...;                     // 省略
    return q;
}

__global__ void(float *dest, float *array, int m){
    float p[m];
    int i;
    for(i = 0; i <= m; i++){
        p[i] = i;
    }
    float *result = fun1(p, m);
    ...;                   // 省略
}

但如果改成如下,就可以正常运行:

__device__ void fun1(float *q, float *p, int m){
    ...;      // 对q做一番操作
    return q;
}

__global__ void(float *dest, float *array, int m){
    float p[m], q[m];
    int i;
    for(i = 0; i <= m; i++){
        p[i] = i;
    }
    fun1(q, p, m);
    ...;                          // 省略
}

想问下第一种方式报错是什么原因,以及如何能在第一种方式上修改,使得第一个函数满足返回float*的形式?

第3行。。。你都省略了哪些内容,是否修改了q指针地址呢?