Если я выделю только 4 байта для одного int, как тогда указатель может хранить второе int? - PullRequest
0 голосов
/ 03 марта 2019

Как я нашел на одном сайте следующий код:

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

int main(void) 
{
    int *p1 = malloc(4*sizeof(int));  // allocates enough for an array of 4 int
    int *p2 = malloc(sizeof(int[4])); // same, naming the type directly
    int *p3 = malloc(4*sizeof *p3);   // same, without repeating the type name

    if(p1) {
        for(int n=0; n<4; ++n) // populate the array
            p1[n] = n*n;
        for(int n=0; n<4; ++n) // print it back out
            printf("p1[%d] == %d\n", n, p1[n]);
    }

    free(p1);
    free(p2);
    free(p3);
}

Вывод:

p1 [0] == 0

p1 [1] == 1

p1 [2] == 4

p1 [3] == 9

Теперь, следуя приведенному выше коду, я сделал это:

#include <stdio.h>
#include <stdlib.h>
#include "Header.h"

int main()

{

    int  *ip = (int*)malloc(1 * sizeof(int));

    ip[0] = 2;
    ip[1] = 9;

    printf("%d %d",ip[0],ip[1]);



    return 0;
}

Вывод: 2 9

Так как же тогда мой указатель* ip может хранить более одного int, когда я выделил байты только для одного int?

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Помните, ip[1] эквивалентно *(ip + 1), что синтаксически допустимо для любого указателя, даже если ip указывает на один int, а не на массив int s.

Разыменование или запись в ip[1] - это неопределенное поведение .Попробуйте добавить free(ip) перед return 0 во второй программе и наблюдайте за поведением.

0 голосов
/ 03 марта 2019

Вы пишете в память, которая находится за пределами массива.К сожалению, для этого нет проверки компилятором, но иногда она работает.

Примечание. Это неопределенное поведение и не должно использоваться ни при каких обстоятельствах.

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