TurboC - malloc()in" compact"记忆模型

时间:2018-06-17 13:02:20

标签: c malloc dos turbo-c

我正在使用适用于DOS的老式Borland的TurboC编译器。当我在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()获得正确的指针?任何建议将不胜感激。

2 个答案:

答案 0 :(得分:4)

根据旧的参考手册,包括Stream<String> lines = Files.lines(path); dsl.createTable(TABLE1) .column(COL1, SQLDataType.CLOB) .column(COL2, SQLDataType.CLOB) .execute(); dsl.insertInto(TABLE1) .columns(COL1, COL2) .values(VAL1, lines .collect(Collectors.joining(System.lineSeparator()))) .execute(); 应该解决这个问题。 (其他系统上的编译器也会为此代码打印警告。)

如果没有原型,java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3332) ~[na:1.8.0_141] at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124) ~[na:1.8.0_141] at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448) ~[na:1.8.0_141] at java.lang.StringBuilder.append(StringBuilder.java:136) ~[na:1.8.0_141] at java.lang.StringBuilder.append(StringBuilder.java:76) ~[na:1.8.0_141] at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:484) ~[na:1.8.0_141] at java.lang.StringBuilder.append(StringBuilder.java:166) ~[na:1.8.0_141] at java.util.StringJoiner.add(StringJoiner.java:185) ~[na:1.8.0_141] at java.util.stream.Collectors$$Lambda$491/1699129225.accept(Unknown Source) ~[na:na] at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169) ~[na:1.8.0_141] at java.util.Iterator.forEachRemaining(Iterator.java:116) ~[na:1.8.0_141] at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) ~[na:1.8.0_141] at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) ~[na:1.8.0_141] at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) ~[na:1.8.0_141] at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) ~[na:1.8.0_141] at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:1.8.0_141] at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) ~[na:1.8.0_141] 会被隐式声明为返回<stdlib.h>。返回的malloc值将自动转换为指针。但是在紧凑的内存模型中,指针和int没有相同的表示,因此隐式声明和转换不会产生正确的值。

在64位类UNIX平台上隐式声明int也会发生同样的事情。

答案 1 :(得分:2)

如果你希望内存分配能够正常运行,而内存模型使用远大指针,则必须包含alloc.h。尝试将此添加到您的文件中:

#include <alloc.h>