Как использовать calloc () в C? - PullRequest
3 голосов
/ 24 февраля 2011

Разве я не должен получить сообщение об ошибке, если моя строка превышает 9 символов в этой программе?

// CString.c
// 2.22.11

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

main()
{
    char *aString = calloc(10, sizeof(char));

    if (aString == NULL)
    {
        return 1;
    }

    printf("PLEASE ENTER A WORD: ");
    scanf("%s", aString);

    printf("YOU TYPED IN: %s\n", aString);
    //printf("STRING LENGTH: %i\n", strlen(aString));
}

Спасибо

blargman

Ответы [ 2 ]

6 голосов
/ 24 февраля 2011

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

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

Рассмотрите возможность использования спецификатора размера следующим образом:

scanf("%9s", aString);

так что вы не переполняете свой буфер.

1 голос
/ 24 февраля 2011

Да, вы получили ошибку. И самое печальное, что вы не знаете об этом. Вы можете узнать об этом позже в программе, когда что-то таинственно падает (если вам повезет), или когда адвокаты вашего клиента приходят подать на вас в суд (если вы не).

...