2017-10-16 45 views
0

当我运行下面的节目,我有这个问题。一切都编译得很好,但是当我运行它并输入内容时,我收到了分段错误消息。它不是一个完整的代码,只是它的一部分,它应该将一些字符串(地址)从输入文件写入字符串数组,然后在数组中搜索可能的搜索字符串(作为参数输入)。我该怎么做“分段故障(核心转储)”的错误?(没有找到答案其他地方)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
    char *entry1 = argv[1], *adress[100], *possibleAdress[100], c; 
    int i,j,k,possible = 0; 

    while(c = getchar()!=EOF)   //write addresses to array 
    { 
    while(c = getchar()!=13) 
     { 
     adress[i][j] = c; 
     j++; 
     } 
     i++; 
    } 

    i = 0; 

    while(adress[i]!=0)  //find adresses matching with search enrty 
    { 
    j = 0; 
    while(adress[i][j]!=0) 
    { 
     while(entry1[j]==adress[i][j]) 
     j++; 
     if(j==strlen(entry1))  //check if the whole search entry is matching 
     { 
     possibleAdress[k] = adress[i]; 
     k++; 
     } 
     i++; 
    } 
    } 
    return 0; 
} 
+0

我j和k都没有被初始化中使用的,程序调用未定义的行为。 – George

+1

此外,您还没有为'adress'和'possibleAdress'分配任何内存,所以您正在将值写入随机地址。段错误正是正确的回应。 –

+0

只是改变你的数组,使他们不指针。否则,你将不得不做的@LeeDanielCrocker建议和实际分配的内存为您阵列明确使用malloc 焦炭取值范=的argv [1],ADRESS [100],possibleAdress [100],C; – victor

回答

2

有一件事我可以清楚地看到不正确的是,你在while循环使用之前,你有没有初始化主i的值和j。

0

我该怎么做“分段故障(核心转储)”的错误?

前一个问题什么是内存设计缺陷:What is a segmentation fault?

你跟他们做的是打破了一个调试器,GDB例如。然后,您可以逐行逐行执行代码,通过指令进行指导并了解问题的原因。

其他的答案是正确的,我& j是初始化。调试将允许您检查这些变量和内存访问。

0

你需要大量的修正。要增加一个指针,你需要分配足够的内存给它。你的while循环完全错误,你试图增加指针值而不分配内存,这就是它给你sig故障错误的原因。

第一变化这一行:int i=0,j=0,k=0,possible = 0;

现在while循环

while(c = getchar()!=EOF)   //write addresses to array 
{ 
    j = 0; 
    char *p = malloc(30);// size should be change as per your requirement 
    address[i] = p; //store the address of p here 
    while(c = getchar()!=13) 
    { 
    *((adress[i])+j) = c; //it is just like *p++ = c 
    j++; 
    } 
    i++; 
}