跟进原计划:Segmentation fault (core dumped) in C byte reader
我的程序应该有点模仿(以一种原始的方式),但目前不起作用。
我已经花了相当长的时间来处理这个问题,以前,由于我使用一个未初始化的节点作为first_node,或者因为我以前使用feof()而不是fread(.)= 0,所以我得到了一个分段错误(核转储)。我已经实现了昨晚给我的两个建议,但现在我更感到困惑了。我甚至不知道这个错误意味着什么,更不用说我为什么要得到它了。下面是我的源代码:
#include <stdio.h>
#include <stdlib.h>
struct node{
char ANSII;
struct node *next_node;
};
void clear_list(struct node *first_node);
void print(struct node *first_node);
int counter(struct node *first_node);
void append(char temp, struct node *first_node);
int main(int argc, char **argv){
FILE *f = NULL;
struct node header;
char temp;
if(argc != 2){ /* argv[0] = name of the program, argv[1] = file to open */
printf("usage: %s filename:", argv[0]);
}
f = fopen(argv[1], "rb");
if(f == 0){ /* check for successful read */
printf("Could not open file.\n");
}
while(!feof(f)){
fread(&temp, sizeof(1), 1, f);
if(temp >= 32 && temp <= 128){ /* If it falls between the bounds of printable characters. */
append(temp, &header); //Builds the string
}else{
if(counter(&header) > 3){
print(&header);
}
clear_list(&header);
}
}
return 0;
}
void clear_list(struct node *first_node){
struct node *conductor;
while(first_node != NULL){
conductor = first_node;
while(conductor->next_node != NULL){
conductor = conductor->next_node;
}
free(conductor);
}
}
void print(struct node *first_node){
struct node *conductor = first_node;
while(conductor != 0){
printf("%s", conductor->ANSII);
conductor = conductor->next_node;
}
printf("\n");
}
int counter(struct node *first_node){
struct node *conductor = first_node;
int counter = 0;
while(conductor != 0){
conductor = conductor->next_node;
counter++;
}
return counter;
}
void append(char temp, struct node *first_node){
struct node *conductor = first_node;
while(conductor->next_node != 0){
conductor = conductor->next_node;
}
conductor->next_node = malloc(sizeof(conductor->next_node));
if(conductor->next_node == 0){
printf("Memory allocation failed!");
return;
}
conductor = conductor->next_node;
conductor->ANSII = temp;
}到目前为止,我尝试实现答案,现在不是分段错误,而是运行时崩溃:
*** glibc detected *** ./mystrings: double free or corruption (fasttop): 0x0000000000601250 ***
======= Backtrace: =========
/lib64/libc.so.6[0x3886a75916]
./mystrings[0x400798]
./mystrings[0x40072f]
/lib64/libc.so.6(__libc_start_main+0xfd)[0x3886a1ecdd]
./mystrings[0x4005b9]
======= Memory map: ========
00400000-00401000 r-xp 00000000 00:1b 1921384528 /afs/pitt.edu/home/n/a/nap54/private/cs449/project2/mystrings
00600000-00601000 rw-p 00000000 00:1b 1921384528 /afs/pitt.edu/home/n/a/nap54/private/cs449/project2/mystrings
00601000-00622000 rw-p 00000000 00:00 0 [heap]
3886600000-3886620000 r-xp 00000000 fd:00 180 /lib64/ld-2.12.so
388681f000-3886820000 r--p 0001f000 fd:00 180 /lib64/ld-2.12.so
3886820000-3886821000 rw-p 00020000 fd:00 180 /lib64/ld-2.12.so
3886821000-3886822000 rw-p 00000000 00:00 0
3886a00000-3886b89000 r-xp 00000000 fd:00 183 /lib64/libc-2.12.so
3886b89000-3886d89000 ---p 00189000 fd:00 183 /lib64/libc-2.12.so
3886d89000-3886d8d000 r--p 00189000 fd:00 183 /lib64/libc-2.12.so
3886d8d000-3886d8e000 rw-p 0018d000 fd:00 183 /lib64/libc- 2.12.so
3886d8e000-3886d93000 rw-p 00000000 00:00 0
388d200000-388d216000 r-xp 00000000 fd:00 6639 /lib64/libgcc_s-4.4.6-20120305.so.1
388d216000-388d415000 ---p 00016000 fd:00 6639 /lib64/libgcc_s- 4.4.6-20120305.so.1
388d415000-388d416000 rw-p 00015000 fd:00 6639 /lib64/libgcc_s- 4.4.6-20120305.so.1
7ffff7fd5000-7ffff7fd8000 rw-p 00000000 00:00 0
7ffff7ffb000-7ffff7ffe000 rw-p 00000000 00:00 0
7ffff7ffe000-7ffff7fff000 r-xp 00000000 00:00 0 [vdso]
7ffffffea000-7ffffffff000 rw-p 00000000 00:00 0 [stack]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted (core dumped)现在我完全迷路了。有人会流下(更多)吗?洞察力?谢谢你们的帮助,我昨晚还没睡好,这个项目(还有更重要的第二部分)将于今晚午夜完成.我知道我只是在粘贴我的代码,并说“拥有它”,但我真的不知道从哪里开始,因为这是我第一次遇到这样的崩溃。
发布于 2013-10-15 16:45:37
您的clear_list函数释放列表的尾部,然后重复。一旦到达只剩下一个节点的点,它就会反复尝试释放first_node。clear_list可以更简单地写成
void clear_list(struct node *first_node){
struct node *ptr = first_node;
struct node *next;
while (ptr != NULL) {
next = ptr->next_node;
free(ptr);
ptr = next;
}
}另一个问题,最初由Grijesh Chauhan指出的,是这条线
printf("%s", conductor->ANSII);是错的。conductor->ANSII有char类型,因此您应该使用%c格式说明符来打印其值。
发布于 2013-10-15 16:45:01
您确实应该学习如何使用像gdb之类的调试器。
一个明显的问题是,您没有在next结构中初始化header字段。因此,当您添加时,它会开始遍历它,谁知道它会在哪里结束(不要假设字段被初始化为0)。
发布于 2013-10-15 16:58:32
你使用了两次sizeof,它们都错了。
sizeof(1)是int的大小,因为1是int常量。最有可能是4,具有典型的8位字节和32位int,所以您的fread试图将4个字节读入一个字符。那可不好。
在另一种情况下,您几乎已经为malloc使用了推荐的安全malloc成语
p = malloc(sizeof *p);但你忘了*。因此,您分配了足够的空间来保存指向结构的指针,而不足以容纳结构。
conductor->next_node = malloc(sizeof(*conductor->next_node));https://stackoverflow.com/questions/19386519
复制相似问题