【问题标题】:Unexpected result in C program, using Malloc and for loopC 程序中的意外结果,使用 Malloc 和 for 循环
【发布时间】:2024-01-15 01:01:02
【问题描述】:

我的 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

我假设最后的结果是指针的值,但是为什么会这样呢?

我尝试修改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

所以,问题是,为什么会这样?

谢谢

【问题讨论】:

  • sizeof(blocks)指针的大小。你确定这就是你想要的吗?看起来不像。试试blocks=malloc(n_block * sizeof *blocks); ?
  • sizeof(struct block)count &lt; n_block
  • 没问题,但是for(int count=0;count&lt;=n_block-1;count++)通常写成for (int count = 0; count &lt; n_block; count++)
  • Your code as is 给出了一些奇怪的输出。 A version with the correct sizeof 给出了预期的输出。
  • @pmg 是的,我认为问题出在 u_ 的回答中建议的 sizeof(block) 上

标签: c for-loop struct printf malloc


【解决方案1】:

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++ )

【讨论】:

  • 好的,现在可以了。为什么 sizeof(blocks) != sizeof(struct block) ?
  • sizeof *blocks 可能会更好,以防blocks 的类型发生变化。
最近更新 更多