方法C编程中的Segmentation Fault错误

Segmentation Fault error in method C programming

下面是我创建的名为 inputReader 的方法的代码,它从文本文件中读取输入并将其复制到 struct wordz 中,然后从该结构中检索 3 个最常用的单词,如下所示。

我试图将所有 3 个单词连接成一个指针,这样我就可以 return 它到主要方法,但是每当我使用任何方法处理 w1、w2、w3 时,它都会复制到一个新结构或数组或指针我总是得到这个错误 "Segmentation fault(core dumped)"

知道为什么会发生这种情况或者我该如何解决它?

结构代码:

#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);

您正在尝试连接到一个未初始化的指针。分配内存给 'p'.

char *p = malloc(size)

最好通读 strcat 的文档以检查您是否正确使用它。例如,您可以在这里查看 http://man7.org/linux/man-pages/man3/strcat.3.html。在 Whosebug 上也有很多类似问题的答案,您会发现它们很有帮助:

  • Segmentation fault- strcat
  • strcat causing segmentation fault
  • strcat segmentation fault

但是,为了让您省去一些痛苦,错误是因为没有为结果字符串 p 分配任何 space。 strcat 不像在 C# 或其他语言中那样在 C 中执行此操作。

你需要:

char p[maxletters];

更好的是,您应该使用具有大小限制的 strncpy 来防止内存损坏:

strncpy(p, w1, maxletters);

导致您的问题的根本原因是 p 没有指向任何地方,因此尝试将数据复制到它会调用臭名昭著的未定义行为。

因此,从堆或堆栈中为 p 分配一些内存。

要从堆中获取它:

char * p = malloc(some_size);

然后尝试 strcat() 数据到此指针时请注意 strcat() 期望其第一个参数已经指向有效的 C-"string",即 0-终止的 char 数组,它可以连接第二个参数指向的内容。

要注意这一点,请确保 p 指向的数据至少将其第一个字节设置为 0:

p[0] = '[=11=]';

如果不是所有字节:

memset(p, 0, some_size);

如果选择后者,您可能还想这样做:

char * p = calloc(some_size, sizeof *p);

As calloc()malloc() 的作用相同,并且另外初始化所有分配给 0 的内存。

如果您觉得初始化太费力,那么您不能使用 strcat() 开始连接,而应该从 strcpy() 开始,这 依赖它的第一个参数指向有效的 C-"string",但只是简单地将其第二个参数指向的内容复制到其第一个参数指向的位置。

chart * p = malloc(some_size);
strcpy(p, w1);  
strcat(p, " ");
...

最后:

  • 如果不再需要内存,请不要忘记在 p 上调用 free(),以避免内存泄漏。

  • 也总是检查内存分配的结果,即在使用之前检查 malloc/calloc()NULL 的结果。