c - struct 中指针的 malloc() 不会将内存绑定到声明的大小
问题描述
我想将*float vec_value
(成员struct vec
)绑定到定义的大小。我使用 malloc():
pattern_ptr->vec_value=malloc(dataset.mFeatures * sizeof(float))
为了确保分配正确完成,如果 VALUE>=dataset.mFeatures 在以下情况下,我希望看到 SegFault:
printf("%f\n",pattern_ptr[N].vec_value[VALUE]);
但它编译并打印内存中相邻区域的值。
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include "parser.h"
struct vec{
int id_vec;
float *vec_value;
};
//prototipi
Dataset loadDataset(void); // struct { int nPattern; int mFeatures; float *dataset_ptr; }
int main(){
int i,j;
Dataset dataset=loadDataset();
struct vec *pattern_ptr=malloc(dataset.nPattern * sizeof(struct vec));
pattern_ptr->vec_value=malloc(dataset.mFeatures * sizeof(float));
for(i=0;i<dataset.nPattern;i++){
pattern_ptr[i].id_vec=i;
pattern_ptr[i].vec_value=&dataset.dataset_ptr[i*dataset.mFeatures];
}
printf("%f\n",pattern_ptr[1].vec_value[10]);
怎么了?
解决方案
C 语言标准不要求对数组访问进行边界检查(个别实现可能会添加边界检查,但我不知道有任何这样做)。如果您在数组(或malloc
'ed 缓冲区)之外进行索引,它也没有指定行为应该是什么。编译器和运行时环境都不需要以任何特定方式处理这种情况(行为未定义)。
由程序员决定不要在数组末尾读取或写入。
推荐阅读
- python - 在 Pandas 中获取一列的唯一值并按它们对其他列的值进行分组
- windows - 资源与字符串中的目录路径
- python - 是否可以在 Tkinter 的一个标签中使用 2 种不同的字体?
- gitlab - 如何在 gitlab-ci.yml 中定义和使用字符串列表
- javascript - 如何使用 AWS SDK v3 为经过身份验证的用户请求临时 STS 凭证?
- excel - 是否可以使用动态过滤器的结果填充 Excel 工作表?
- amazon-ec2 - 是否可以在不同的 EC2 机器上创建一个 Kafka 集群?
- firebase - VSCode 不再自动完成/建议 firebase 方法?
- mysql - MySQL 查询未按预期运行
- batch-file - 使用“rundll 键盘,禁用”运行批处理文件是否需要恢复出厂设置才能修复?