使用C中的双指针进行分段错误的问题

时间:2013-11-28 09:19:58

标签: c pointers segmentation-fault

所以我的目标是创建一系列特定单词。这是我正在使用的当前代码:

char **specificWords; //Global
specificWords = malloc(100 * sizeof( char *));

int addToArray(char * word, int i){
     specificWords[i] = word;
     printf("%s\n", specificWords[i]);
return 0;
}

现在只是假装在main中,函数重复调用函数,增加“i”值和新的“words”。函数内部的print语句完全正常,但如果我尝试在函数外部使用相同的print语句,程序将以seg错误错误结束。

我仍然是C编程的新手,但我尝试了许多不同的东西,从每次调用时为数组分配空间。对于不同的递增方法,如“(** specificWords)++”,只是在主要使用循环,但我真的无法搞清楚。

如果你需要澄清任何事情,请告诉我,谢谢。

编辑:这是主...我试图发布一个程序来解释我的问题,所以这是真正的一个:

char **specificWords; //Global
char *globalString;

int main(int argc, char* argv[]) {
    specificWords = malloc(100 * sizeof( char *));
    int newLineCount = countLines(globalString);
    addToArray(newLineCount);
    printf("%s\n", specificWords[0]); //segFaults
    return 0;
}


int addToArray(int newLineCount){
   int ch;
   int loc = 0;
   char *tempKeyword;
   char temp[5026];
   int j = 0;
   int k = 1;
   j = 0;
   for(int i = 0; i < newLineCount; i++){
       while(1){
           //I read in a file and made the whole thing one big string which is global string
           ch = globalString[loc];
           if(ch == '\n')
               break;
           temp[j] = ch;
           loc++;
           j++;
       }
       loc++;
       temp[j] = '\0';
       tempKeyword = temp;
       specificWords[k] = tempKeyword;
       printf("%s\n", specificWords[k]);
       //k++; // if used seg faults...
    }
}

2 个答案:

答案 0 :(得分:2)

您存储的指针word可能超出范围或以其他方式变为无效。

直接存储像你这样的指针通常是错误的,也许addToArray()函数应该存储strdup(word)的返回值。然后你还需要测试它的失败,当然,因为它分配了内存。

答案 1 :(得分:2)

  1. 您使用了函数内部定义的本地字符串变量char temp[5026];,在退出函数后将停止存在,因此您的printf将在函数中完美地工作但如果您尝试打印addToArray以外的任何内容。

    说明:

    {   // this is a block of code, for example function body
    
        char word[128]; // this string will exist at this level of code
    
        // it will work perfectly at this level
    
    }
    // now, there's no word variable at all, any pointer to it's address (data)
    // is invalid and could crash or you would read garbage from it
    
  2. 在这一行:

    tempKeyword = temp;
    specificWords[k] = tempKeyword;
    

    您总是为每个单词分配整个临时缓冲区,因此您将始终获得所有特定单词索引中读取的第一个单词,例如specificWords[2]。 要遵循unwind的建议,重写代码以从开头读取每个单词到temp,然后使用strdup将单词复制到动态分配的内存中,这些内存将从函数返回后继续存在。你的for循环内部:

     j = 0; // always reset the position to buffer from beginning
     while(1){
           //I read in a file and made the whole thing one big string which is global string
           ch = globalString[loc];
           if(ch == '\n')
               break;
           temp[j] = ch;
           loc++;
           j++;
       }
       loc++;
       temp[j] = '\0';
       tempKeyword = strdup(temp);
       specificWords[k] = tempKeyword;
       printf("%s\n", specificWords[k]);
    
  3. 您正在从这一行开始计算您的单词索引:

    int k = 1;
    

    在C语言中,数组中的索引从零开始,因此您从specificWords的容量中丢失了一个单词,因此您可以在数组中存储最多99个单词。要解决此问题,您可以从索引k=0开始。