Неожиданный результат в программе на C, использующей Malloc и цикл - PullRequest
0 голосов
/ 10 октября 2018

У меня проблема с моим кодом в C:

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


int main()
{
    int i1,j1,k1;
    int n_block;
    struct  block
    {
        int i,j,k;
    } *blocks;
    n_block=3;
    i1=4;
    k1=3;
    j1=2;
    blocks=malloc(n_block*sizeof(blocks));
    for(int count=0;count<=n_block-1;count++){
        printf("count %d\n",count);
        blocks[count].i=i1;
        blocks[count].j=j1;
        blocks[count].k=k1;
        printf("results:%d\n",blocks[count].i);
        printf("results:%d\n",blocks[count].j);
        printf("results:%d\n",blocks[count].k);
    }
}

Ожидаемый результат:

count 0
results:4
results:2
results:3
count 1
results:4
results:2
results:3
count 2
results:4
results:2
results:3

, но я получаю:

count 0
results:4
results:2
results:3
count 1
results:4
results:2
results:3
count 2
results:4
results:2
results:1970496882

IПредположим, что последний результат является значением указателя, но почему это происходит?

Я попытался изменить цикл for (без изменения n_block):

for(int count=0;count<=n_block+1;count++)

, и я получаю:

count 0
results:4
results:2
results:3
count 1
results:4
results:2
results:3
count 2
results:4
results:2
results:1970496882
count 3
results:4
results:2612
results:10
count 4
results:4
results:2
results:3

Итак, вопрос в том, почему это происходит?

Спасибо

1 Ответ

0 голосов
/ 10 октября 2018

В случае malloc оператор sizeof(blocks) будет соответствовать размеру указателя, а в вашем случае sizeof(blocks) != sizeof(struct block)

изменить malloc на

 blocks = malloc(n_block * (sizeof( struct block) ) ); // more readable

for loop здесь слишком сложный, придерживайтесь основ

for(int count=0; count < n_block; count++ )
...