c - TurboC - "compact"内存模型中的 malloc()

标签 c malloc dos memory-model turbo-c

我正在使用旧的 Borland 的 TurboC 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;
}

当我将其编译为 small 时内存模型,我得到:

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

当我对compact做同样的事情时内存模型,我得到:

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()获得正确的指针?任何建议将不胜感激。

最佳答案

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

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

隐式声明 malloc 会发生几乎相同的情况在 64 位类 UNIX 平台上。

关于c - TurboC - "compact"内存模型中的 malloc(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50896929/

相关文章:

c - 如何打印字符串中空格后的所有字符?

c - 添加的值不会正确保存到 malloc 数组。我忽略了内存泄漏吗?

c - 拆分字符串中的空格并将它们存储在没有库的C中的表中

operating-system - DOS如何同时执行多个进程?

windows - 日期中缺少日期

c - 如何修复此代码中的段错误?

c - 将 Raspberry Pi W 连接到 Kinesis Video Streams 时出错

c - 如何在不更改原始数组或分配新数组的情况下对两个数组进行排序?

c++ - 如何在 MS DOS 而不是 Borland 上手动编译和运行(通过单个命令)C++ 程序?

c++ - 用 C++ 编写多平台实现