Как именно создаются указатели массива, если не используются скобки с указанным размером в C? - PullRequest
0 голосов
/ 22 февраля 2012

Я довольно запутался с указателями в C. Мне трудно сосредоточиться на их создании и раздаче? У меня ошибка «Ошибка сегментации: 11» после добавления кода, в котором ранее это работало. Нужно что-то добавить. Это часть кода:

char *token2;
char *line2;
char comma_loc = 0;
int num_of_commas = 0;
char *line2[1];

while(token != NULL) { //lets make sure token has a string token
        //printf("Wats in token: %s\n", token);
        if(key==true) {
            //printf("This should be an identifier: %s\n", token);

            if(comma != true) { //added if statement, just take away if it fails, the first case is the original
            int len = strlen(token);
            iden_holder[iden_holder_count] = (char *)malloc(sizeof(char) * (len +1));
            memcpy(iden_holder[iden_holder_count], token, len +1);
            iden_holder_count++;
            key = false;
            } else {

                int len2 = strlen(token);
                line2[0] = (char *)malloc(sizeof(char) * (len2 + 1));
                memcpy(line2[0], token, len2 + 1);
                token2 = strtok(line2[0],",");
                    while(token2 != NULL) {
                            int len = strlen(token2);
                            iden_holder[iden_holder_count] = (char *)malloc(sizeof(char) * (len +1));
                            memcpy(iden_holder[iden_holder_count], token, len +1);
                            iden_holder_count++;
                            token2 = strtok(line2[0],",");
                        }
                key = false;

            }

Смысл этого кода в том, чтобы взять строку внутри токена и скопировать ее в другой токен, в моем случае token2. Я решил использовать memcpy, но я запутался, как использовать его из-за путаницы указателей. Я должен также отметить, что я использовал strtok до этого, и код здесь находится внутри. Может ли случиться так, что, если я буду использовать его снова, он переопределит другой?

Ответы [ 2 ]

2 голосов
/ 22 февраля 2012

Читать это полностью. Это поможет вам с вашими основами. Это сделал со мной. :)

1 голос
/ 22 февраля 2012

Указатели - это именно так: указатели. Они должны указывать на что-то. Подавляющее большинство проблем, с которыми люди сталкиваются с указателями, заключается в том, что они никуда не умны: -)

Рассмотрим следующий код:

char xyzzy[] = "hello";
char *pch;

В реализации C на основе стека это, вероятно, даст вам стек, содержащий строку и указатель на произвольное значение.

Указатель существует в стеке, как и любая другая переменная, но он может указывать куда угодно.

Если вы затем выполните:

pch = xyzzy;

он указывает на первый символ xyzzy (h).

Массивы и указатели - это очень разных зверей. Например, вы не можете увеличивать xyzzy, чтобы указывать на второй символ этой строки, но вы можете увеличивать pch.

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

Это в основном причина, почему вам не нужны [] для указателей, потому что они не являются массивами. Они не знают и не заботятся о том, сколько вещей может существовать в памяти, на которую они указывают, их единственное беспокойство - это то, на что они в настоящее время указывают one .

Перемещение указателя по всему массиву и обеспечение того, чтобы вы не сходили с ума, - это дополнительное управление, которое вы должны выполнять как программист.

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