2016-01-13 2 views
3

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

с динамическим распределением, массивами и указателями.

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

struct BOOK 
{ 
    char* author; 
    char** genders; 
    int totalGenders; 
    char* name; 
    int* chapterPages; 
    int totalChapters; 

}typedef book; 

, когда я пытался достичь имя автора, строка 1 в составе:

struct BOOK 
{ 
    char* author; 

Я не удалось сделать это .. мой код в основной:

int main() 
{ 
    book* b; 
    char authorChar[10] = { 0 }; 
    int authorLen; 
    char* authorName; 


    // get author name 
    puts("please enter the name of the author"); 
    scanf("%s", &authorChar); 
    authorLen = strlen(authorChar); 
    printf("%d", authorLen); //print to see that lentgh is correct. 

    authorName = (char*)calloc(authorLen, sizeof(char)); 
    strcpy(authorName, authorChar); 
    puts("\n"); 
    b->author = authorName; 

    printf("%d", b->author); 

, когда у меня есть отладка, у меня возникла проблема в этом lin е:

b->author = authorName; 

идеи, пожалуйста? :)

+0

'зсапЕ ("% s", & authorChar);' -> 'Scanf ("% 9s", authorChar);' –

+0

[Пожалуйста, смотрите эту дискуссию о том, почему не бросить возвращаемое значение 'таНос() 'и семью в' C'.] (http://stackoverflow.com/q/605845/2173917). –

ответ

3

Проблема заключается в следующей строке

b->author = authorName; 

в этой точке, b не выделяется память, т.е. b является неинициализированным указателем. Он указывает на случайную ячейку памяти, которая не является действительной. Любая попытка доступа к недопустимой памяти вызывает undefined behavior.

Вы можете использовать любой из следующего подхода для решения этой проблемы:

  • выделить память для b динамически, прежде чем использовать его, как b = malloc(sizeof*b); и чек на успех.

  • определяет b как переменную типа book, а не указатель на тип.

Это говорит, int main() должен быть int main(void) по крайней мере, соответствовать стандартам.

+0

Благодарим вас за ответ! , моя ошибка действительно началась, когда я определил 'b' как указатель на тип, не инициализируя его. (я сделал это, потому что в будущем будущее book struct будет всего лишь одним из массивов книг ...). – MoZZ

+0

@Sourav Ghosh Добро пожаловать! – Ziezi

1

Вы забыли сделать выделение памяти для переменной b.

b = malloc(sizeof(book)); 
b->author = malloc(sizeof(100000)); // replace value for the size you want 
+0

^^ \t См. Комментарий к вопросу о том, почему бы не использовать возвращаемое значение 'malloc()' и family в C. –

+0

Спасибо. Есть время, которое я не кодирую в C. Более 4 лет. –

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