【发布时间】:2017-05-12 00:16:04
【问题描述】:
我正在尝试创建一个程序来创建马尔可夫链,但我遇到了指针问题。当我运行程序时,我遇到了分段错误。
#include <stdio.h>
#include <cstring>
#include <cstdlib>
struct word;
struct nextword
{
word* sourceword;
word* next = 0;
};
int wordcount;
struct word
{
char* wordstr;
struct word* next = 0;
nextword* followingword = 0;
int nextwordcount = 0;
};
int main()
{
word* firstword = 0;
char * buffer = 0;
long length;
FILE * f = fopen ("alice.txt", "rb");
if (f)
{
fseek (f, 0, SEEK_END);
length = ftell (f);
fseek (f, 0, SEEK_SET);
buffer = (char *)malloc (length);
if (buffer)
{
fread (buffer, 1, length, f);
}
fclose (f);
}
if (buffer)
{
char wordbuffer[500];
int fileindex = 0;
while(fileindex < length-1)
{
int wordindex = 0;
while(buffer[fileindex] != ' ')
{
wordbuffer[wordindex] = buffer[fileindex];
wordindex++;
fileindex++;
}
if(wordindex != 0)
{
wordbuffer[wordindex] = '\0';
word* newword = (word*)malloc(sizeof(word));
char* newwordstr = (char*)malloc((strlen(wordbuffer)+1)*sizeof(char));
strcpy(newword->wordstr, newwordstr);
if(!firstword)
{
firstword = newword;
}
else
{
word* testword = firstword;
while(!testword->next)
{
testword = (testword->next);
}
testword->next = newword;
printf(newword->wordstr);
}
}
return 0;
}
}
else
{
return 1;
}
}
我试图删除文件读取部分并用硬编码字符串替换它,但问题仍然存在。
【问题讨论】:
-
您是否尝试过在调试器中运行并查看它在哪一行崩溃?
-
如果您不知道如何使用调试器,您至少可以使用打印语句并查看它崩溃的位置,然后更深入地分析该部分。
-
除此之外,这里唯一的 C++ 内容就是您如何编写包含。如果您的目标是 C 程序,请更改它们(例如 cstdlib => stdlib.h)
-
word* newword = (word*) malloc(sizeof(word));为newword分配存储空间。没有为newword中的指针分配存储空间。建议您开始利用构造函数,std::vectors 和std::strings -
C中需要
struct word *sourceword;,类型为struct word *;word* sourceword;适用于 C++。