gpt4 book ai didi

C 程序在 Cygwin 中运行但在 Linux (Malloc) 中不运行

转载 作者:太空宇宙 更新时间:2023-11-04 02:19:31 25 4
gpt4 key购买 nike

我有一个堆分配错误,我无法在我的代码中发现该错误,该错误是在 Linux 上的 vanguard/gdb 上获取的,但在 Windows cygwin 环境中运行完美。我知道 Linux 的堆分配可能比 Windows 更严格,但我真的很想得到发现问题/可能修复的响应。我也知道我不应该在 C 中对 malloc 进行类型转换,但这是一种习惯的力量,不会改变我的问题的发生。我的程序实际上在 Linux 和 Windows 上编译都没有错误,但是当我在 Linux 上运行它时,我得到了一个可怕的结果:

malloc.c:3074: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed. Aborted

我的代码中的附加片段被指出为审查错误:

/* Main */

int main(int argc, char * argv[]) {

FILE *pFile;
unsigned char *buffer;
long int lSize;

pFile = fopen ( argv[1] , "r" );
if (pFile==NULL) {fputs ("File error on arg[1]",stderr); return 1;}

fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);

buffer = (char*) malloc(sizeof(char) * lSize+1);
if (buffer == NULL) {fputs ("Memory error",stderr); return 2;}

bitpair * ppairs = (bitpair *) malloc(sizeof(bitpair) * (lSize+1));

//line 51 below
calcpair(ppairs, (lSize+1));

/* irrelevant stuff */

fclose(pFile);
free(buffer);
free(ppairs);
}

typedef struct {
long unsigned int a; //not actual variable names... Yes I need them to be long unsigned
long unsigned int b;
long unsigned int c;
long unsigned int d;
long unsigned int e;
} bitpair;

void calcpair(bitpair * ppairs, long int bits);

void calcPairs(bitpair * ppairs, long int bits) {

long int i, top, bot, var_1, var_2;
int count = 0;

for(i = 0; i < bits; i++) {

top = 0;

ppairs[top].e = 1;

do {
bot = count;
count++;
} while(ppairs[bot].e != 0);

ppairs[bot].e = 1;

var_1 = bot;
var_2 = top;

bitpair * bp = &ppairs[var_2];
bp->a = var_2;
bp->b = var_1;
bp->c = i;

bp = &ppairs[var_1];
bp->a = var_2;
bp->b = var_1;
bp->c = i;

}

return;
}

gdb 报告:free():无效指针:0x0000000000603290 *

由于“VALGRIND INTERNAL ERROR”信号 11 (SIGSEGV),valgrind 在退出之前报告了 5 次以下消息:
大小 8 的无效读取
==2727== at 0x401043: calcPairs (in/home/user/Documents/5-3/ubuntu test/main)
==2727== by 0x400C9A: main (main.c:51)
==2727== 地址 0x5a607a0 未被堆栈、malloc 或(最近)释放

最佳答案

粗略猜测 ftell 返回 -1 并且 malloc 不喜欢被要求分配零字节。 malloc(0) 的行为依赖于 C 中的实现。

关于C 程序在 Cygwin 中运行但在 Linux (Malloc) 中不运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2766911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com