下面是我所做的一个名为inputReader的方法的代码,它从文本文件中读取输入并将其复制到struct wordz,并从该结构中检索3个最常用的单词,这些单词显示在下面。
我试图连接所有3个单词作为一个指针,所以我可以将它返回到main方法,但每当我使用任何方法来处理w1,w2,w3,复制到新的结构或数组或指针我总是得到此错误"分段错误(核心转储)"
知道为什么会这样或者我如何解决它?
结构代码:
#define maxLetters 101
typedef struct {
char word[maxLetters];
int freq;
} WordArray; //struct type
代码:
char * w1; // most frequent word
char * w2; // second most frequent word
char * w3; // third most frequent word
// finds w1
for(j = 0; j < uniqueWords; j++)
if(wordz[j].freq == freqz[uniqueWords-2]+1)//excludes whitespace frequency
w1 = wordz[j].word;
// finds w2
for(j = 0; j < uniqueWords; j++)
if(wordz[j].freq == freqz[uniqueWords-3]+1)//excludes whitespace frequency
w2 = wordz[j].word;
// finds w3
for(j = 0; j < uniqueWords; j++)
if(wordz[j].freq == freqz[uniqueWords-4]+1)//excludes whitespace frequency
w3 = wordz[j].word;
char *p;
// if i dont include strcat methods the method runs fine and outputs fine
strcat(p, w1); // once this operation is executed i get the error
strcat(p, " ");
strcat(p, w2);
strcat(p, " ");
strcat(p, w3);
答案 0 :(得分:0)
您正在尝试连接到未初始化的指针。将内存分配给'p'。
char *p = malloc(size)
答案 1 :(得分:0)
最好彻底阅读strcat的文档以检查您是否正确使用它。您可以在此处查看http://man7.org/linux/man-pages/man3/strcat.3.html。对stackoverflow上的类似问题也有很多答案,你会发现它们很有帮助:
但是,为了省去一些痛苦,错误是因为没有为结果字符串p
分配任何空间。 {C}或其他语言中的strcat
不会像在C#或其他语言中那样执行此操作。
你需要:
char p[maxletters];
更好的是,您应该使用大小限制的strncpy来防止内存损坏:
strncpy(p, w1, maxletters);
答案 2 :(得分:0)
导致您的问题的根本原因是p
没有指向任何地方,因此尝试将数据复制到它会调用臭名昭着的未定义行为。
因此,要从堆中或从堆栈中为p
分配一些内存。
要从堆中获取它:
char * p = malloc(some_size);
当尝试strcat()
数据到此指针时,请注意strcat()
期望其第一个参数已经指向有效的C - &#34;字符串&#34;,这是{{ 1}} - teminated 0
数组,它可以连接第二个参数指向的内容。
要注意这一点,请确保数据char
指向的是至少将其第一个字节设置为p
:
0
如果不是所有字节:
p[0] = '\0';
如果选择后者,您可能也愿意:
memset(p, 0, some_size);
由于char * p = calloc(some_size, sizeof *p);
与calloc()
的作用相同,因此会初步启动使用malloc()
分配的所有内存。
如果您认为初始化需要付出很多努力,那么您就无法使用0
开始连接,但需要从strcat()
开始,不依赖于它的第一个参数指向一个有效的C - &#34;字符串&#34;,但只是复制它的第二个参数指向它的第一个参数指向的位置。
strcpy()
最后:
如果不再需要内存,请不要忘记在chart * p = malloc(some_size);
strcpy(p, w1);
strcat(p, " ");
...
上致电free()
,以避免内存泄漏。
在使用之前,还要检查内存分配的结果,即检查p
/ malloc
对calloc()
的结果。