выделение массива символов и печать первой записи - PullRequest
1 голос
/ 12 июля 2010

когда я запускаю это, я получаю segv на printf, что я делаю неправильно?

int main() {
        char **bla;
        int size =10;
        int i;

        bla = calloc(size*size,sizeof(char *));

        for(i=0;i<size;i++) {
                *bla = calloc(10,sizeof(char));
                strncpy(*bla,"aaaaa",size);
                bla++;
        }

        printf("%s\n",bla[0]);
}

Я знаю, что могу сделать это с

int main() {
        char **bla;
        int size =10;
        int i;

        bla = calloc(size*size,sizeof(char *));

        for(i=0;i<size;i++) {
                bla[i] = calloc(10,sizeof(char));
                strncpy(bla[i],"aaaaa",size);
        }



   printf("%s\n",bla[0]);
   }

но есть ли способ сделать это с помощью указателей?

Ответы [ 3 ]

5 голосов
/ 12 июля 2010

Когда вы пишете bla++, вы меняете bla, чтобы указывать на следующий указатель.

В конце bla[0] (что эквивалентно *bla) было увеличено в 10 рази укажет место в памяти сразу после выделенного блока.

Вы можете исправить это, написав bla -= 10 после цикла.

Однако лучший способ исправить это - не увеличивать bla вообще, и вместо этого напишите

 *(bla + i) = calloc(10,sizeof(char));

В качестве альтернативы, вы можете объявить второй указатель (char** currentBlah = blah) и вместо этого увеличить его, а затем вывести blah[0], который все равно будет указывать на исходную ячейку памяти.

1 голос
/ 12 июля 2010

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

for (p=bla; p < bla+size; p++) { 
        *p = calloc(size, sizeof(char)); 
        strncpy(*p, "aaaaa", size); 
} 
0 голосов
/ 12 июля 2010

Проблема в том, что в первом случае вы перемещали указатель bla за конец массива (последний bla ++), поэтому при доступе к первому вы фактически получаете доступ после последнего

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...