2015-02-17 2 views
0

Я пишу программу, и в своей программе мне нужно скопировать информацию из 1-го массива 1D в 2D-массив, но каждый раз, когда в массиве 1n находится массив \ n, он предполагает перейти в разные слоты в 2D-массиве. Например, если массив 1D равен Hello \ nWorld в массиве 2d он станет привет/n в первом слоте и мир во втором слоте.Сбой сегментации 2D-массива

Вот мой код Но я получаю ошибку сегментации. Массив, называемый символами, уже сделан в моей программе до этого шага.

words = (char**) malloc(numWords*sizeof(char)); 
    int copyCountForChars=0; 
    int copyCountForWords=0; 


    while(copyCountForWords <= numWords) 
    { 

     words[copyCountForWords][copyCountForChars] = chars[copyCountForChars]; 
     // printf("%c",chars[copyCountForChars]);              
     if(chars[copyCountForChars] == '\n') 
     { 
      // printf("%c",chars[copyCountForChars]);            

      copyCountForWords++; 

     } 

     copyCountForChars++; 
    } 
+1

Вы пренебрегали выделение памяти для этой последовательности указателей numWords, которые вы указали в первой строке кода. Обе разыменовывают их (записывают или читают, не имеют значения) и даже * оценивая *, они вызывают неопределенное поведение. ([OT: не бросать 'malloc' в код C] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc?s=1|6.6202). – WhozCraig

+0

На самом деле, Numwords объявлено ранее в моем коде, извините. Numwords - это просто количество слов, которое содержит массив 1D – user1335175

+0

Фактически этот factoid имеет * ничего *, чтобы сделать с моим комментарием, прочитайте его снова. Вы изначально выделяете последовательность * * указатели **. Указатели, которые вы выделили, сами являются ** неопределенными **, они указывают на неизвестность, неопределенные, большие запредельные. Им не назначены действительные адреса. Развертывание этих указателей вызывает * неопределенное поведение *. каждый указатель указывает на * что-то * действительное, возможно, другое распределение на. – WhozCraig

ответ

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

int main(){ 
    char str[100] = "hello\nworld\nstack\noverflow"; 

    int numWords = 4; // you can handle this part 
    char **words = malloc(numWords * sizeof(char *)); 

    char *tok = strtok(str, "\n"); 
    int counter = 0; 
    while(tok != NULL){ 
     words[counter] = tok; 
     counter++; 
     tok = strtok(NULL, "\n"); 
    } 

    printf("%s\n", words[0]); // hello 
    printf("%s\n", words[1]); // world 
    printf("%s\n", words[2]); // stack 
    printf("%s\n", words[3]); // overflow 

} 

Я представляю указатель отношения как этот

diagram


Если хотите добавить \n в конце строковым вы можете использовать этот фрагмент кода. Но я думаю, что это плохой стиль кодирования, когда вы скрываете \n внутри переменной.

int main(){ 
    char *str = "stackoverflow"; 
    int size = strlen(str); 
    char str2[size+1]; 
    strcpy(str2, str); 
    strcpy(str2+size, "\n"); 

    printf("%s", str2); 
} 
+0

спасибо, один вопрос. Как я могу сделать это, чтобы каждый массив слов имел/n в конце, поэтому мне не нужно класть \ n при использовании printf. Также возможно ли это обойтись без использования строк? – user1335175

+0

Вы можете использовать ascii-коды для печати символов и других символов. [источник] (http://www.cquestions.com/2008/01/write-c-program-for-printing-ascii.html) Но опять-таки, это плохая практика использования кодов ascii и сделать ваш код сложным Понимаю. – gkiko

+0

Не очень скрываю \ n в моих переменных, если правильно понимаю ваше замечание, потому что моя программа предназначена для использования в сочетании с командой od -c в linux, поэтому я хочу видеть \ n в конце каждого слова. – user1335175

2

Распределение памяти для 2D-массива должно выполняться следующим образом.

words = malloc(sizeof(char *) * size1); 
for(i = 0; i< size1; i++) 
{ 
    words[i] = malloc(sizeof(char) * size2); 
} 
+3

Не должно быть sizeof (char *) в этом первом распределении? – paisanco

+1

Да. Я пропустил это. Сейчас поправляем. – niyasc

+0

Эффективной методикой является 'words = (char **) malloc (sizeof (* words) * numWords);' в этом контексте. Вы использовали 'size1', где в вопросе использовался' numWords', который незначительно вводит в заблуждение. Неясно, как рассчитывается 'size2' в вашем ответе (и соответствующий размер не вычисляется в вопросе AFAICS). –

0

WhozCraig является правильным. Ваш malloc для слов не выделяет достаточно памяти и, вероятно, вызывает сбои в доступе к памяти за пределами границ. Вот почему: Say numWords = 2, то следующая строка:

слова = (символ **) таНос (numWords * SizeOf (Char));

фактически делает malloc (2 * 1). sizeof (char) равен 1.

Вы выделили только 2 байта памяти.

Возможно, вы имели в виду размерof (chars) с точки зрения распределения? Это даст вам размер 1-мерного массива. Даже тогда вам все равно придется копировать каждый байт за один раз из одного массива в другой, что в настоящее время не выполняется.

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