方法C编程中的分段错误错误

时间:2015-01-16 19:40:46

标签: c linux struct segmentation-fault

下面是我所做的一个名为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);

3 个答案:

答案 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 / malloccalloc()的结果。