我正在尝试使这种动态重新分配以可移植的方式工作。
我的程序接受来自用户的一行文本并将其附加到缓冲区。如果缓冲区中的文本长度为 20 或更多,它会删除前 20 个字符并将其后的任何字符移动到缓冲区的开头。
我有这段代码可以在 Linux 上运行干净,但是当我在 Windows 上运行它时会发出垃圾。有谁知道为什么/如何仅使用 malloc 使其可移植。IE 不使用 string.h(strcpy) str... 除了 len。
仅限 c17 - 没有破损的结构(不可移植)。这是我的代码。编译没有错误 gcc 7.3, mingw 7.3。我用更安全的功能替换了gets和puts,但我仍然在windows上得到垃圾。我认为这是一个格式问题...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
void wbuff (message)
char *message;
{
FILE *f = fopen("file.txt", "w");
fprintf(f, "%s", message);
fclose(f);
}
char *rean (message)
char *message;
{
/* performs (write) on buffer, trims lefover, then restores */
char buf[80] = "";
puts("enter a line");
gets(buf);
int bln = strlen( buf );
int mln = strlen( message );
int nln = bln + mln;
printf("new length %d\n", nln);
message = realloc(message, nln);
memmove(message + mln, buf, bln);
/* MISTAKE IS HERE?! */
if( nln >= 20 ) {
int exl = nln -20; // leftover length
char *lo = realloc(NULL, exl); // leftover placeholder
memmove(lo, message+20, exl); // copy leftover
wbuff(message); // write clear buff
message = realloc(NULL, nln);
message = realloc(NULL, exl); // resize buffer
memmove(message, lo, exl); // restore leftover
}
return message;
}
void main (void)
{
char *message = "";
message = realloc(NULL, 0);
while ( 1 == 1 ) {
message = rean( message );
puts(message);
}
return;
}