@Zuoya

Почему в массив размером N можно положить больше чем N элементов?

есть массив
char az [] = "123456789-"
мне нужно сделать срез этого массива .для этого я написал функцию
char* get_slice(char *input,size_t input_len,int a, int b ){
    if ( a >= input_len || b >= input_len) { return NULL;}
    int j,i,out_leng = (0);
    char *out = malloc(sizeof(char)*out_leng);
    
    for (j= 0,i = a; i <= b; i++,j++) {
      
        out[j] = input[i];
    }

    printf("leng = %d\n",j);
   
    return out;
}

она как бы работает, но я указал размер массива out равным 0 и почему то в него можно копировать данные .
вот полный пример
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char* get_slice(char *input,size_t input_len,int a, int b );
char* get_slice(char *input,size_t input_len,int a, int b ){
    if ( a >= input_len || b >= input_len) { return NULL;}
    int j,i,out_leng = (0); // out_leng = b -a;
    char *out = malloc(sizeof(char)*out_leng);
    
    for (j= 0,i = a; i <= b; i++,j++) {
      
        out[j] = input[i];
    }

    printf("leng = %d\n",j);
   
    return out;
}

int main(int argc, char const *argv[])
{
    char az [10] = "123456789-";
    int l = 7;
    // новый массив должен иметь данные от 2 до 5 индекса массива az
    char *z = get_slice(az,sizeof(az),2,5);
    if (z == NULL) {
        puts("ERR");
    }else
    {
        printf("%s",z);
    }
    return 0;
}
  • Вопрос задан
  • 136 просмотров
Решения вопроса 3
15432
@15432
Системный программист ^_^
Потому что в языке Си вы сами должны контролировать работу с памятью и следить, чтобы не происходило записи за пределы массива, переполнения стека и т.д.

В данном случае из-за такой записи за границы допустимого возможны любые глюки вплоть до падения программы.
Ответ написан
GavriKos
@GavriKos
Потому что си.
Он не проверяет как вы там корректно или нет с памятью работаете.
Кстати еще очень зависит от настроек компилятора - в условном дебаге и релизе может быть разное поведение
Ответ написан
@res2001
Developer, ex-admin
В malloc при передаче в качестве аргумента нуля возвращаемое значение не определено (implementation-defined). Так что фиг знает что там вам вернул маллок. Но раз программа не падает, то, возможно, он вернул какой-то указатель на стек, а в стеке у вас есть ~8МБ - развлекайтесь.
В общем не нужно так делать. На другом компиляторе (или на том же, но другой версии) поведение может быть совсем другим.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы