- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是一个学校项目。我编写了一个名为 file_to_array_d 的函数,它将所有字符放入一个数组中,因此可以轻松操作文件。
程序根据从用户那里读取的内容对文件进行一些处理。目前只有“V”和“R”选项应该有效。 'V' 打印出文件的内容。
在第一次运行主循环时一切正常(在 main() 函数中循环)。但是在第二次运行时我得到了 glibc 错误。
*** glibc detected *** ./a.out: realloc(): invalid pointer: 0x00007f01ad4397f8 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7f01ad0ffb96]
/lib/x86_64-linux-gnu/libc.so.6(realloc+0x2de)[0x7f01ad10495e]
./a.out[0x400ec9]
./a.out[0x400d3d]
./a.out[0x4009b1]
./a.out[0x40090c]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7f01ad0a276d]
./a.out[0x400819]
======= Memory map: ========
00400000-00402000 r-xp 00000000 08:05 3543576 /home/hork/Dropbox/FIIT/PPR/projekt/a.out
00601000-00602000 r--p 00001000 08:05 3543576 /home/hork/Dropbox/FIIT/PPR/projekt/a.out
00602000-00603000 rw-p 00002000 08:05 3543576 /home/hork/Dropbox/FIIT/PPR/projekt/a.out
01318000-01339000 rw-p 00000000 00:00 0 [heap]
7f01ace6b000-7f01ace80000 r-xp 00000000 08:05 4722212 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f01ace80000-7f01ad07f000 ---p 00015000 08:05 4722212 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f01ad07f000-7f01ad080000 r--p 00014000 08:05 4722212 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f01ad080000-7f01ad081000 rw-p 00015000 08:05 4722212 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f01ad081000-7f01ad236000 r-xp 00000000 08:05 4723475 /lib/x86_64-linux-gnu/libc-2.15.so
7f01ad236000-7f01ad435000 ---p 001b5000 08:05 4723475 /lib/x86_64-linux-gnu/libc-2.15.so
7f01ad435000-7f01ad439000 r--p 001b4000 08:05 4723475 /lib/x86_64-linux-gnu/libc-2.15.so
7f01ad439000-7f01ad43b000 rw-p 001b8000 08:05 4723475 /lib/x86_64-linux-gnu/libc-2.15.so
7f01ad43b000-7f01ad440000 rw-p 00000000 00:00 0
7f01ad440000-7f01ad462000 r-xp 00000000 08:05 4723489 /lib/x86_64-linux-gnu/ld-2.15.so
7f01ad63f000-7f01ad642000 rw-p 00000000 00:00 0
7f01ad65c000-7f01ad662000 rw-p 00000000 00:00 0
7f01ad662000-7f01ad663000 r--p 00022000 08:05 4723489 /lib/x86_64-linux-gnu/ld-2.15.so
7f01ad663000-7f01ad665000 rw-p 00023000 08:05 4723489 /lib/x86_64-linux-gnu/ld-2.15.so
7fffe5f17000-7fffe5f38000 rw-p 00000000 00:00 0 [stack]
7fffe5fff000-7fffe6000000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted (core dumped)
我使用的是 Ubuntu 12.04,代码是用 gcc 编译的
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
这是完整的源代码,请注意一些注释是斯洛伐克语的,但重要的是英文的。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <execinfo.h>
#define DEBUG
#define DETAILED_DEBUG
#define FILE_RELATIVE_PATH "ucet.txt"
void dump(char **p, int n);
char ** output_file();
char ** file_to_array_d(FILE * fd, long * rows);
void print_trace ();
void * xrealloc (void *ptr, size_t size);
void fatal(char *message);
void biggest_credit();
int main(int argc, char const *argv[])
{
char argument;
char ** p = NULL;
double * suma = NULL;
int open = 0;
while( (argument = getchar()) != 'K')
{
if (argument == 'V') // vypise na obrazovku obsah suboru
{
output_file();
open = 1;
}
else if (argument == 'n') // aktualizuje polia
{
//number_of_records = parse_file(cena, pocet_dni);
}
else if (argument == 'l') // najlacnejsia cena
{
//calculate_lowest_price(cena, pocet_dni, number_of_records);
}
else if (argument == 'h') // histogram
{
//histogram(cena, pocet_dni, number_of_records);
}
else if (argument == 'R') // najvyssia cena za posledny rok
{
if (open)
biggest_credit();
}
}
return 0;
}
char ** output_file()
{
FILE * f = fopen(FILE_RELATIVE_PATH, "r");
if (f == 0)
{
printf("Neotvoreny subor\n");
return 0;
}
long size = 0;
char ** p = NULL;
p = file_to_array_d(f, &size);
//dump(p, size);
printf("Size: %li\n", size );
int i, r = 0;
for (i = 0, r = 0; r < (int)size; i++, r++)
{
switch(i)
{
case 0:
printf("transakcia: %s\n", p[r]);
break;
case 1:
printf("kredit/debet: %s\n", p[r]);
break;
case 2:
printf("cislo uctu kam/odkial idu peniaze: %s\n", p[r]);
break;
case 3:
printf("suma: %s\n", p[r]);
break;
case 4:
printf("datum: %s\n", p[r]);
break;
case 5:
printf("\n");
i = -1;
break;
}
}
fclose(f);
return p;
}
void biggest_credit()
{
FILE * f = fopen(FILE_RELATIVE_PATH, "r");
if (f == 0)
{
return;
}
long size = 0;
char ** p = file_to_array_d(f, &size);
double max = 0;
int max_index;
int i;
// suma je 4. riadok, takze index 3 je prva suma
for (i = 3; i < size; i += 6)
{
if ( (double)atof(p[i]) > max && atoi(p[i-2]) == 1 )
{
max = (double)atof(p[i]);
max_index = i;
}
}
if (max)
{
printf("%s\n", p[max_index]);
}
}
/*
* Parameters:
* FILE * - pointer to the file handle
* long * - pointer to adress, where the number of rows is written
*
* Returs:
* char * - pointer to the start of array containing file
*
* Info:
*
*/
char ** file_to_array_d(FILE * fd, long * rows)
{
char c; // current char being read from file
int current_row = 0; // starting from first row
int current_pos = 0;
// whole file will be stored in p[][]
// allocate first row
#ifdef DEBUG
printf("calling (char**) malloc( %i );\n", 1 * (int)sizeof(char *) );
#endif
char **p = (char **) malloc(1 * sizeof(char *));
// until EOF is reached
for(current_pos = 0; ; current_pos++)
{
if (EOF == fscanf(fd, "%c", &c))
{
if (p[current_row] == 0)
{
// un-allocate space
p = (char**) xrealloc(p, ((current_row) * sizeof(char *)) );
}
break;
}
#ifdef DETAILED_DEBUG
printf("row: %2i pos: %2i\n",current_row, current_pos );
printf(" read char: '%c'\n\n", c);
#endif
// if char was read and it is not EOF
// allocate new space for char
#ifdef DEBUG
printf("calling (char*) xrealloc(p[%i ], %i);\n",current_row, current_pos+1);
#endif
p[current_row] = (char*) xrealloc(p[current_row], current_pos+1);
if (c != '\n')
{
// place read char there
p[current_row][current_pos] = c;
}
else // if new line
{
// place end of string there
p[current_row][current_pos] = '\0';
#ifdef DATAILED_DEBUG
printf("\tp[%i] = '%s' \n", current_row, p[current_row]);
#endif
// allocate and increment new row
current_row++;
#ifdef DEBUG
printf("calling (char**) xrealloc(p, %i);\n", (current_row + 1) * (int)sizeof(char *) );
#endif
p = (char**) xrealloc(p, ((current_row + 1) * sizeof(char *)) );
// set to -1, it will be zero in the next run of loop
current_pos = -1;
#ifdef DEBUG
int i;
for (i = 0; i < current_row; ++i)
{
printf("p[%2i] is at: %p size: %4li contains: %s\n",i, &p[i], sizeof(*p[i]) ,p[i] );
}
printf("\n");
#endif
}
}
// if EOF is in the position: '\n EOF'
// right way to end file
if( p[current_row] == 0)
{
#ifdef DEBUG
printf("%s\n", "Subor je spravne ukonceny n.1 :)");
#endif
*rows = current_row;
}
// if EOF is right behind line
// wrong way to end file
else
{
#ifdef DEBUG
printf("%s\n", "Subor je nespravne ukonceny !! (ale to nevadi)");
#endif
*rows = current_row+1;
}
#ifdef DEBUG
printf("Number of lines: %i\n", current_row);
#endif
return p;
}
void * xrealloc (void *ptr, size_t size)
{
register void *value = realloc (ptr, size);
if (value == 0)
fatal ("Virtual memory exhausted");
return value;
}
void dump(char **p, int n)
{
int i, s;
printf("-- DUMP --\n");
for(i = 0; i < n; i++)
{
for(s = 0; p[i][s] != '\0'; s++)
printf("%c", p[i][s]);
printf("\n");
}
printf("-- END OF DUMP --\n");
}
// A function to display an error message and then exit
void fatal(char *message)
{
char error_message[100];
strcpy(error_message, "[!!] Fatal Error ");
strncat(error_message, message, 83);
perror(error_message);
exit(-1);
}
感谢您的支持,这让我抓狂了几个小时。
最佳答案
在 Valgrind 下运行您的程序;它会告诉您确切问题是什么。
关于c - glibc/realloc/无效指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15731703/
这个问题在这里已经有了答案: Multiple glibc libraries on a single host (11 个回答) 5年前关闭。 有没有办法在本地文件夹中安装新版本的 GLIBC?我将
这个问题在这里已经有了答案: Deploying Yesod to Heroku, can't build statically (4 个回答) 1年前关闭。 我有两台机器 RHEL 4机 RHEL
我在 C 启动时读取 article ,它指的是函数 __libc_csu_init 。谁能告诉我CSU代表什么? 最佳答案 我在 libc p 中找到了对“ C s tart u p”的引用。 这远
我正在使用 AlpineLinux(安装在我的计算机上,而不是安装在 docker 中)并且我正在尝试使用依赖于 glibc 的共享库。 由于 Glibc 没有集成到这个发行版中,我看到开发了一个替代
所以我正在玩 Alpine Linux,它使用 musl 与 glibc。 我发现由于这个选择,我无法运行 Oracle Java 或在 glibc 下构建的静态二进制文件。 musl 是否应该与更广
在构建 glibc 时,出现此错误。 *glibc/build/elf/dl-allobjs.os: file not recognized: File format not recognized c
我一直在寻找没有好的结果。 我想知道在文本中解释为 Malloc Maleficarum 或 Malloc Des-Malleficarum 的技术在 glibc 2.12.1 版本中是否有效。 在提
我在 CentOS 上安装 gcc 时遇到问题。 我的命令的输出sudo yum install gcc: Loaded plugins: fastestmirror Loading mirror s
我想下载gzip类型的mariadb,但是我发现它有很多文件可以下载,例如mariadb-10.2.6-linux-x86_64.tar.gz,mariadb-10.2.6-linux-glibc_2
我想尝试使用不同的 glibc 的 sin 函数。他们是否可以在不编译整个 glibc 的情况下使用不同 glibc 版本的 sin 函数? 我已经在我的虚拟 ubuntu 机器上下载了不同版本的 g
我要在超算中心的目录下安装一个软件,但是sudo,root,连apt-get,yum都不能用...这个软件需要glibc2.7,所以我得手动安装gcc和glibc(因为我无法更改内置 gcc 的路径来
我正在研究需要在多个不同的嵌入式平台上运行的 C 和 C++ 程序,为此我有交叉编译器,因此我可以在我的 x86 桌面上进行构建。 我在某些功能上遇到了一个可怕的问题,例如“strtod()”。这是我
我遇到了一个非常烦人的问题:我有一个程序,它在开始时创建一个线程,该线程将在执行期间启动其他内容(fork() 紧随其后的是 execve())。 这是我的程序达到(我认为)死锁时两个线程的 bt:
我刚刚发现,glibc 2.23 有一个关于 stdio 函数 fmemopen() 的错误,参见例如Using rewind() on a FILE* opened with fmemopen .
[root@localhost Keystone2]# sudo rpm -ivh glibc-2.3.4-2.9.audit.x86_64.rpm --nodeps --force warning:
从该系列中很容易找到如何使用 dlsym()和其他函数,但是在内部如何工作呢?是否可以编写自己的,容易实现的dlsym()? 我想知道是否有可能实现类似的行为,但在不将与-ldl链接的情况下实现(可以
嗨,我目前使用的是 ubuntu 9.10 和 glibc 版本 2.11.1-0,好吧,我正在做一个项目,我想用 glibc 的另一个版本(2.5-58)进行测试,我想知道以下与此相关的事情: 如何
我已经下载了glibc,这样我就可以修改它的代码然后使用它。所以只是为了玩玩它,我更改了 glibc 的 stdio-common 目录中的 printf 函数,以便它打印“你可以看到我吗?”。 in
我正在集群上的 conda 环境中部署 R 脚本。该脚本加载了一些需要 glibc 版本 >= 2.14 的包。虽然我的系统的 glibc 版本为 2.14,但集群的 glibc 版本为 2.12,我
所以。我有一个问题,我在一台机器上有两个版本的 GCC。 3.4.6 和 4.1 这是由于新软件的一些依赖性问题。 (需要 glibc 4.1) 当我将这个新软件与 4.1 库链接时,它链接得很好。但
我是一名优秀的程序员,十分优秀!