printf%p segfaulting

时间:2011-04-05 13:51:04

标签: c pointers segmentation-fault printf

        printf("\nframe is: %p",&frame);
        printf("\nframeprev is: %p",&framePrev);

首先出现的任何行都将始终正确打印。 无论打印哪个指针,第二行将始终在上面的代码中进行分段。任何想法为什么这是?我试过fflush(stdout);在每个printf之后,但这似乎没有区别。

使用以下

对指针进行delcaired
frame =(double**) malloc(cols*sizeof(double));
framePrev =(double**) malloc(cols*sizeof(double));

if(frame==NULL||framePrev==NULL){
    printf("malloc epic fail\n");
    return 0;
}

/*allocate mem for 2nd dimention*/

for(i=0;i<cols;i++){
    frame[i]=(double*) malloc(rows*sizeof(double));
    framePrev[i]=(double*) malloc(rows*sizeof(double));
    /*check for null pointer*/
    if(frame[i]==NULL||framePrev[i]==NULL){
        printf("malloc epic fail\n");
        return 0;
    }
}

3 个答案:

答案 0 :(得分:2)

我不知道为什么你提供的代码会出现段错误。但是,您要打印的是指针的地址,而不是指针的内容。换句话说,frame是一个指针变量;它是4个字节大,并且存在于某个堆栈/堆上。你打印出某处的地址。我认为你想要的是打印框架的价值;这将是框架所持有的实际指针。所以脱掉&amp;在每一行,看看你得到了什么。

另外,你的内存分配很奇怪。 A(double **)是一个指向数组的指针,该数组包含指向双精度的指针;但是你的malloc调用会分配一个包含双精度数组的数组。你可能想要malloc(cols * sizeof(double *))。这个代码有效,因为double大于double *,所以你实际上分配了足够的内存,但它仍然是错误的。

答案 1 :(得分:1)

您的printf语句没有任何问题。如果你是segfaulting,可能是因为你的例程中有一个错误并且已经破坏了内存。

你发布的一个明显的问题是你的frame和frameprev数组不是双精度数组,而是双指针数,并且它们的大小不一样。前两行应该是:

frame =(double**) malloc(cols*sizeof(double *));
framePrev =(double**) malloc(cols*sizeof(double *));

答案 2 :(得分:0)

将代码放入test.cpp文件中,如下所示:

int main(){

    int i, cols=4, rows=2;
    double **frame =(double**) malloc(cols*sizeof(double));
    double **framePrev =(double**) malloc(cols*sizeof(double));

    if(frame==NULL||framePrev==NULL){
        printf("malloc epic fail\n");
        return 0;
    }

    /*allocate mem for 2nd dimention*/
    for(i=0;i<cols;i++){
        frame[i]=(double*) malloc(rows*sizeof(double));
        framePrev[i]=(double*) malloc(rows*sizeof(double));
        /*check for null pointer*/
        if(frame[i]==NULL||framePrev[i]==NULL){
            printf("malloc epic fail\n");
            return 0;
        }
    }

    printf("\nframe is: %p",&frame);
    printf("\nframeprev is: %p",&framePrev);
}

通过g ++ test.cpp编译,通过./a.out - &gt;

运行
frame is: 0x7fff5fbffaf8
frameprev is: 0x7fff5fbffaf0

根本没有分裂。

你怎么编译?您的帖子中现在显示的代码的任何其他更改? 你如何初始化变量?

个REG。