2013-11-28 3 views
0

Итак, моя цель - создать массив конкретных слов. Вот текущий код, который я использую:Проблема с ошибками сегментации с использованием двух указателей в C

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

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

Теперь просто делать вид, в основном функция повторяющегося вызова функции с приращением «I» ценности и новые «слова». Оператор печати внутри функции работает отлично, но если я попытаюсь использовать тот же оператор печати вне функции, программа закроется с ошибкой ошибки seg.

Я все еще новичок в программировании на языке C, но я пробовал много разных вещей, от выделения пространства для массива каждый раз, когда он вызывается. Для разных методов приращения, таких как «(** specificWords) ++», и просто используя цикл в основном, но я действительно не могу понять это.

Сообщите мне, если вам нужно что-нибудь разъясненное, спасибо.

EDIT: Вот Main ... Я пытался опубликовать программу, чтобы объяснить мою проблему, так вот реальный:

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... 
    } 
} 
+1

shre ваш главный код. код печати в основном. или делить весь код – MOHAMED

+0

@MOHAMED, ладно, дайте мне мгновение, чтобы опубликовать его. – JumpingRock

+0

@MOHAMED Я обновил его – JumpingRock

ответ

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 индексов пример в specificWords[2]. Чтобы воспользоваться советом для разговора, перепишите код, чтобы прочитать каждое слово temp, с самого начала, а затем с помощью strdup скопировать слово в динамически выделенную память, которая выдержит возврат из вашей функции. Внутри вашей цикл:

    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. Вы подсчета ваших индексов слов от 1 на этой линии:

    int k = 1; 
    

    В языке C, индексы массивов начинаются с нуля, так что вы теряете одно слово от емкости specificWords, поэтому вы можете хранить максимум 99 слов в массиве. Чтобы решить эту проблему, вы можете начать с индекса k=0.

+0

О, ладно, я понял, поэтому он указывает на память, но это память, которую я постоянно переписываю. Разве это не было бы целью использования глобальной переменной? Так что я мог бы сохранить все, что захочу, а потом просто переписать его? Или это потому, что я использую указатели, что я не могу этого сделать? Я принял остальных комментаторов совета использования strdup, и это не помогло. Извините, если я наивна, но мой учитель сказал мне использовать глобальную переменную для хранения всех слов. Я не вижу, как это сделать, если я не могу скопировать слова в массив, не беспокоясь о том, превратятся ли слова в мусор или нет :( – JumpingRock

+0

Спасибо, что указали, что он начинается с 1 !!! I работали безостановочно в этой программе, и это все решило, и я просто закончил тем, что поставил функцию в основном, а затем использовал «strdup», и он отлично работает. Большое вам спасибо за вашу помощь. – JumpingRock

2

Указатель word, что вы храните, вероятно, будет из или недействительными каким-либо другим способом.

Часто неправильно указывать указатели, как и вы, возможно, функция addToArray() должна сохранить возвращаемое значение strdup(word). Тогда вам также необходимо протестировать его для отказа, конечно, поскольку он выделяет память.

+0

Спасибо за ваш совет, я внедрил это, и он отлично работал (с парой других изменений). Но серьезно спасибо! – JumpingRock

Смежные вопросы