c - C 程序中的意外结果,使用 Malloc 和 for 循环
问题描述
我的 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
所以,问题是,为什么会这样?
谢谢
解决方案
如果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++ )
推荐阅读
- azure-data-factory - azure 数据工厂中的 polybase 和批量插入、复制方法有什么区别以及何时使用它们?
- haskell - 在 Haskell 中从未知序列创建不同类型?
- python - 在 VSCode 中运行 python 文件时如何“删除”“&”符号
- php - 如何使用电子邮件中的按钮更改 woocommerce 中的订单状态(批准订单按钮)
- android - 我无法使用我的应用在外部打开文件 - Android
- azure - Azure 身份验证 - 允许的令牌受众值需要是 URI 或 GUID 格式
- filter - 在控件进入 Rest 端点之前,是否可以在某种过滤器中动态地为自动装配的 Bean 的字段设置值?
- java - 在android中进入PIP模式时如何覆盖动画
- postgresql - Squirrel 将“sql:”附加到错误中,导致错误处理时出现问题
- docker - 规划 CI 管道以构建和推送 docker 容器