【问题标题】:strange Segmentation fault in CC中奇怪的分段错误
【发布时间】:2011-05-13 09:06:36
【问题描述】:
int * mymalloc(int *array, int size){

    //PRINTS THE TIMES MYMALLOC IS CALLED. JUST FOR TESTING;
    printf("~~~~~~~~~~~~~~~TIME(S) MYMALLOC WAS CALLED:~~~~~~~~~~~~~~~ %d\n", i++);

    //checks
    if(size<1){
        printf("SIZE NOT VALID\n");
        return (int *) 0;
    }

    printf("MEMORY FREE JUST WHEN MYMALLOC() IS CALLED: %d\n", (*((BLOCK *)array[0])).size);

    BLOCK currentHeader = (*((BLOCK *)array[0]));

    do{
    printf("CURRENT HEADER STATUS: %d\n", currentHeader.status);
        if(currentHeader.status == 0){
            printf("ok\n");
            if(currentHeader.size >= size){

                currentHeader.status = 1;

                if(currentHeader.size - size < sizeof(currentHeader))
                    return &array[currentHeader.data];

                else{

                    BLOCK nextHeader;

                    array[size + currentHeader.data] =  (int)&nextHeader; 

                    if(currentHeader.nextb !=0){

                        (*currentHeader.nextb).previousb = &nextHeader;
                        nextHeader.nextb = currentHeader.nextb;
                    }

                    currentHeader.nextb = &nextHeader;
                    nextHeader.previousb = &currentHeader;

                    nextHeader.size = currentHeader.size - size - sizeof(nextHeader);//here?

                    nextHeader.data = currentHeader.data + size + sizeof(nextHeader); //here?
                    printf("NEXT HEADER DATA: %d\n", nextHeader.data );

                    nextHeader.status = 0;
                    currentHeader.size = size; //changing the currentHeader.size to the "size" given.

                    printf("%d\n", sizeof(currentHeader));
                    printf("%d\n", size + currentHeader.data);
                    printf("%d\n", nextHeader.size);


                    printf("i return\n");

                    return &array[currentHeader.data];


                }
            }
            //printf("NOT ENOUGH SIZE");
        }

        if(currentHeader.nextb !=0){
            printf("%d\n",*currentHeader.nextb);
            currentHeader = *currentHeader.nextb;

        }

    }while (currentHeader.nextb != 0);

    return (int *) 0;
     //printf("%d\n", (*((BLOCK *)array[0])).status ); 

}

好吧,伙计们,当我运行这个程序时,实际上当我调用这个方法时,就像这样

mymalloc(testarray,50);

当我评论 printf("ok\n"); 行时,我遇到了分段错误。
我的意思是它只是一个 printf 函数。怎么会影响记忆??????
你可以复制粘贴到你的机器上试试吗?
首先是printf("ok\n");
然后//printf("ok\n");

【问题讨论】:

  • 运行它?很好,但是你能给我们我们需要的所有资源吗?

标签: c segmentation-fault


【解决方案1】:

如果您评论该行并且它崩溃了,这意味着您的堆栈已损坏。因此,崩溃可能会在任何“随机”点出现和/或消失而没有任何明显的原因(当然它不是真正随机的,但看起来可能如此)。

您可以生成核心转储和/或使用 valgrind 运行和/或逐步调试它吗?

【讨论】:

  • 我实际上是在 linux 机器上使用 putty 编译代码。该文件存储在共享目录中。
  • 检查 valgrind 或 gdb 是否可用于您的远程 shell
  • 好的。 :P 但到目前为止我还没有使用它。所以我不知道如何让它检查我的代码
  • gdb /path/to/your/appvalgrind /path/to/your/app
  • 查看example
【解决方案2】:

而不是“手动”执行此操作。我建议为此使用适当的工具,例如 valgrind 或 gprof。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多