В чем разница mallo c при умножении на число на sizeof (тип данных) и без умножения на число - PullRequest
1 голос
/ 05 марта 2020
#include <stdio.h>
#include <stdlib.h>

int main() {
    char *buffer = "hello";
    char *words = malloc(6 * sizeof(char));
    int count = 0;

    while (count < 10) {
        *(words+count) = buffer[count];
        count++;
    }

    printf("%s\n", words);
    return 0;
}

Мне интересно, какова разница умножения числа на sizeof(char).

Например, если я удаляю 6 (просто char *words=malloc(sizeof(char));), код тоже работает.

Я предполагал, что это не будет работать, однако, когда я запускаю его, это работает.

Ответы [ 2 ]

5 голосов
/ 05 марта 2020

malloc(6 * sizeof(char)) выделяет достаточно памяти для массива из 6 символов.

Если вы не умножите на 6, вы получите достаточно памяти только для 1 символа. Попытка получить доступ к любому другому символу, кроме *words, приведет к неопределенному поведению.

Ваш код вызывает неопределенное поведение всякий раз, когда count превышает 5. Он пишет после конца words, а чтение после конца buffer; оба они не определены.

Неопределенное поведение не всегда приводит к сообщениям об ошибках, см. Почему я не получаю ошибку сегментации, когда пишу за пределами массива? . Таким образом, ваш код может показаться, что он работает, но он все еще не верен и в будущем может перестать работать.

0 голосов
/ 05 марта 2020

В вашем случае это не имеет особого смысла, потому что sizeof(char) всегда 1.

Но рассмотрим, как рассчитать количество байтов, необходимое для хранения n структур типа my_t.

typedef struct
{
    int a;
    double b;
    float x[10];
    void *y[30];
    float (*c[12])(int);
    /* more and more */
}my_t;


my_t *foo(size_t n)
{
    return malloc(n * sizeof(my_t));
}

Было бы довольно сложно угадать размер struct без использования sizeof.

...