代码之家  ›  专栏  ›  技术社区  ›  Roman Hocke

“紧凑”内存模型中的turboc-malloc()。

  •  0
  • Roman Hocke  · 技术社区  · 6 年前

    我正在使用老伯兰的turboc编译器for DOS。当我使用 malloc() compact 内存模型和写任何东西到分配的内存,程序在某一点冻结(我怀疑 malloc()号 将指针返回到不该写入的位置)。当我在上面做同样的事情时 small 记忆模型,很好用。

    我查看了分配的内存和指针 malloc()号 返回,使用这段代码:

    #include <stdio.h>
    
    unsigned char *x;
    unsigned int i;
    unsigned int mds, mss;
    
    #define X(a) x[i+(a)]
    
    int main(void) {
    
        // show current SS and DS
        asm {
            mov AX, DS
            mov mds, AX
            mov AX, SS
            mov mss, AX
        }
        printf("ds=%04x, ss=%04x\n", mds, mss);
    
        // allocate memory and show the pointer
        x = (unsigned char*)malloc(128);
        printf("x=%p\n", x);
    
        // write out contents of the allocated memory
        for (i = 0; i < 128; i += 16)
            printf("%p: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", &x[i], X(0), X(1), X(2), X(3), X(4), X(5), X(6), X(7), X(8), X(9), X(10), X(11), X(12), X(13), X(14), X(15));
    
        free(x);
        return 0;
    }
    

    当我为 小的 记忆模型,我得到:

    tcc -ms -IC:\turboc\include -LC:\turboc\lib -etest.exe test.c
    
    ds=02f9, ss=02f9
    x=05f2
    05f2: 00 00 00 ... 00
    0602: 00 00 00 ... 00
    ...
    0662: 00 00 00 ... 00
    

    当我也这么做的时候 契约 记忆模型,我得到:

    tcc -mc -IC:\turboc\include -LC:\turboc\lib -etest.exe test.c
    
    ds=034f, ss=0391
    x=0000:0004
    0000:0004: 08 00 70 00 ... 08 00 70 00
    0000:0014: 54 ff 00 f0 ... a5 fe 00 f0
    ...
    0000:0074: a4 f0 00 f0 ... 60 14 00 f0
    

    指针 0000:0004 在我看来很可疑,我怀疑它指向了堆外的某个地方。我不识别内容,但如果我写入内存,程序就会冻结。

    我做错了什么?我该怎么做才能得到正确的指针 malloc()号 是吗?任何建议将不胜感激。

    2 回复  |  直到 6 年前
        1
  •  4
  •   Florian Weimer    6 年前

    根据旧的参考手册,包括 <stdlib.h> 应该解决这个问题。(其他系统上的编译器也会打印此代码的警告。)

    没有原型, malloc 被隐式声明为返回 int .返回的 利息 值自动转换为指针。但是在紧凑型内存模型中,指针和 利息 s没有相同的表示,因此隐式声明和转换不会产生正确的值。

    隐式声明的情况几乎相同 马尔洛克 在64位类Unix平台上。

        2
  •  2
  •   Michael Petch    6 年前

    如果您希望内存分配在使用远指针和大指针的内存模型中按预期的方式工作,那么如果内存为我提供了正确的服务,那么您必须包括 alloc.h .尝试将此添加到文件:

    #include <alloc.h>