【问题标题】:printf %p segfaultingprintf %p 段错误
【发布时间】:2011-04-05 13:51:03
【问题描述】:
        printf("\nframe is: %p",&frame);
        printf("\nframeprev is: %p",&framePrev);

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

指针使用以下方法进行删除

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;
    }
}

【问题讨论】:

  • 试试gdb 之类的调试器或valgrind 之类的内存调试工具。它们可能会很快准确地显示出您的段错误。
  • 你的意思是说printf()s在主代码之后?
  • printfs 位于 malloc 之后的 for 循环的顶部,但在第一次执行循环时,它会报告 2 个 printfs 之间的段错误 - 所以也许只是它在之后出现段错误而且 printf 很慢,我不太确定
  • frame N is: 0xbffff368 Program received signal SIGSEGV, Segmentation fault. 是我得到的输出,我通常希望在下面打印第二条语句

标签: c pointers segmentation-fault printf


【解决方案1】:

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

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

【讨论】:

  • 是的,这就是错误,在分配指针到指针时应该是 double*。难怪它会崩溃。
【解决方案2】:

您的 printf 语句没有任何问题。如果您出现段错误,可能是因为您的例程中有错误并且内存已损坏。

您发布的一个明显问题是您的 frame 和 frameprev 数组不是双精度数组,而是双指针,它们的大小不太可能相同。前两行应该是:

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

【讨论】:

  • 浮点数通常适合寄存器,例如是本机 int 的长度,例如指针的大小。双倍确实更长。
【解决方案3】:

只需将代码放入 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运行->

frame is: 0x7fff5fbffaf8
frameprev is: 0x7fff5fbffaf0

根本没有段错误。

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

规则。

【讨论】:

  • 感谢所有的帮助,真的很有帮助,你们是对的,代码很好,是下一行导致问题,它只是阻止了最终打印到终端(哦!-我的错)。
猜你喜欢
  • 1970-01-01
  • 2013-10-12
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 2010-10-07
相关资源
最近更新 更多