TurboC - "compact" 内存模型中的 malloc()
TurboC - malloc() in "compact" memory model
我正在使用用于 DOS 的 Borland 的 TurboC 编译器。当我在 compact
内存模型上使用 malloc()
并将任何内容写入分配的内存时,程序在某个时候冻结(我怀疑 malloc()
returns 指针指向我不应该写的地方).当我在 small
内存模型上执行相同操作时,它工作正常。
我查看了分配的内存和 malloc()
returns 的指针,使用这段小代码:
#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()
获得正确的指针?任何建议将不胜感激。
如果内存正确地为我服务,如果您希望内存分配按照使用远指针和大指针的内存模型的预期方式运行,则必须包括 alloc.h
。尝试将此添加到您的文件中:
#include <alloc.h>
根据旧的参考手册,包括 <stdlib.h>
应该可以解决这个问题。 (其他系统上的编译器也会针对此代码打印警告。)
没有原型,malloc
被隐式声明为返回 int
。返回的 int
值自动转换为指针。但在紧凑内存模型中,指针和 int
没有相同的表示,因此隐式声明和转换不会产生正确的值。
在 64 位类 UNIX 平台上隐式声明 malloc
会发生几乎相同的事情。
我正在使用用于 DOS 的 Borland 的 TurboC 编译器。当我在 compact
内存模型上使用 malloc()
并将任何内容写入分配的内存时,程序在某个时候冻结(我怀疑 malloc()
returns 指针指向我不应该写的地方).当我在 small
内存模型上执行相同操作时,它工作正常。
我查看了分配的内存和 malloc()
returns 的指针,使用这段小代码:
#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()
获得正确的指针?任何建议将不胜感激。
如果内存正确地为我服务,如果您希望内存分配按照使用远指针和大指针的内存模型的预期方式运行,则必须包括 alloc.h
。尝试将此添加到您的文件中:
#include <alloc.h>
根据旧的参考手册,包括 <stdlib.h>
应该可以解决这个问题。 (其他系统上的编译器也会针对此代码打印警告。)
没有原型,malloc
被隐式声明为返回 int
。返回的 int
值自动转换为指针。但在紧凑内存模型中,指针和 int
没有相同的表示,因此隐式声明和转换不会产生正确的值。
在 64 位类 UNIX 平台上隐式声明 malloc
会发生几乎相同的事情。