如何处理动态分配的结构C中的分段错误
how to deal with Segmentation fault in dynamically allocated struct C
我编写了一个从文本文件中读取单词的程序。每行一个字。我需要找出每个单词重复了多少次。到目前为止,为了找出这一点,我已经从文件中读取了单词并将它们全部放在一个动态分配的结构数组中。我的问题是,每当我尝试 运行 时,程序都会出现分段错误。我假设我动态分配数据的方式存在问题。
代码如下;
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
//struct
struct _data {
char *word;
int number;
};
//scan for size of file
int SCAN(FILE *data) {
int size = 0;
char s_temp[50];
while (1) {
fscanf(data, "%s", s_temp);
if (feof(data)) break;
size++;
}
return size;
}
//load content into struct
int LOAD(FILE *data, int size, struct _data *Wordstruct){
int i;
char temp[50];
for (i=0; i <size; i++){
fscanf(data, "%s", temp , &Wordstruct[i].word, &Wordstruct[i].number);
Wordstruct[i].word =calloc(strlen(temp), sizeof(char));
strcpy(Wordstruct[i].word, temp);
if(strcasecmp(Wordstruct[i].word, temp) ==0){
Wordstruct[i].number++;
}
}
return size;
}
//count how many times each word repeats
void COUNT(struct _data *Wordstruct, int size){
int i;
int count;
count =0;
char *word;
if (strcasecmp(Wordstruct[i].word, word)==0){
count++;
for(i=0; i<size; i++){
printf("%s\n",Wordstruct[i].word,"occurs:\t",count);
}
}
}
//main routine
int main(int argc, char *argv[]){
int size;
FILE *data;
struct _data *Wordlist;
if(argc <2){
printf("Not enough arguments\n");
}
else{
FILE *data= fopen(argv[1],"r");
size =SCAN(data);
LOAD(data, size, Wordlist);
COUNT(Wordlist, size);
}
return 0;
}
您还没有为 Wordlist
分配内存。添加
Wordlist = malloc(size*sizeof(*Wordlist));
在调用 LOAD
之前。
并且,正如@BLUEPIXY 在评论中指出的那样,改变
Wordstruct[i].word =calloc(strlen(temp), sizeof(char));
到
Wordstruct[i].word =calloc(strlen(temp)+1, sizeof(char));
改这个:
Wordstruct[i].word =calloc(strlen(temp), sizeof(char));
给这个:
Wordstruct[i].word =calloc(strlen(temp)+1, sizeof(char));
您需要考虑 NULL 终止符,strlen()
不会在这里为您做。
我编写了一个从文本文件中读取单词的程序。每行一个字。我需要找出每个单词重复了多少次。到目前为止,为了找出这一点,我已经从文件中读取了单词并将它们全部放在一个动态分配的结构数组中。我的问题是,每当我尝试 运行 时,程序都会出现分段错误。我假设我动态分配数据的方式存在问题。 代码如下;
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
//struct
struct _data {
char *word;
int number;
};
//scan for size of file
int SCAN(FILE *data) {
int size = 0;
char s_temp[50];
while (1) {
fscanf(data, "%s", s_temp);
if (feof(data)) break;
size++;
}
return size;
}
//load content into struct
int LOAD(FILE *data, int size, struct _data *Wordstruct){
int i;
char temp[50];
for (i=0; i <size; i++){
fscanf(data, "%s", temp , &Wordstruct[i].word, &Wordstruct[i].number);
Wordstruct[i].word =calloc(strlen(temp), sizeof(char));
strcpy(Wordstruct[i].word, temp);
if(strcasecmp(Wordstruct[i].word, temp) ==0){
Wordstruct[i].number++;
}
}
return size;
}
//count how many times each word repeats
void COUNT(struct _data *Wordstruct, int size){
int i;
int count;
count =0;
char *word;
if (strcasecmp(Wordstruct[i].word, word)==0){
count++;
for(i=0; i<size; i++){
printf("%s\n",Wordstruct[i].word,"occurs:\t",count);
}
}
}
//main routine
int main(int argc, char *argv[]){
int size;
FILE *data;
struct _data *Wordlist;
if(argc <2){
printf("Not enough arguments\n");
}
else{
FILE *data= fopen(argv[1],"r");
size =SCAN(data);
LOAD(data, size, Wordlist);
COUNT(Wordlist, size);
}
return 0;
}
您还没有为 Wordlist
分配内存。添加
Wordlist = malloc(size*sizeof(*Wordlist));
在调用 LOAD
之前。
并且,正如@BLUEPIXY 在评论中指出的那样,改变
Wordstruct[i].word =calloc(strlen(temp), sizeof(char));
到
Wordstruct[i].word =calloc(strlen(temp)+1, sizeof(char));
改这个:
Wordstruct[i].word =calloc(strlen(temp), sizeof(char));
给这个:
Wordstruct[i].word =calloc(strlen(temp)+1, sizeof(char));
您需要考虑 NULL 终止符,strlen()
不会在这里为您做。