我想绑定*float vec_value
(struct vec
的成员)以达到定义的大大小。我用malloc():
pattern_ptr->vec_value=malloc(dataset.mFeatures * sizeof(float))
为了确保分配正确完成,我希望在以下情况下看到 VALUE>=dataset.mFeatures 的 SegFault:
printf("%fn",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("%fn",pattern_ptr[1].vec_value[10]);
怎么了?
C 语言标准不要求对数组访问进行边界检查(单个实现可能会添加边界检查,但我不知道有任何这样做)。 它也没有指定如果在数组(或malloc
缓冲区)之外进行索引时的行为应该是什么。 编译器和运行时环境都不需要以任何特定方式处理这种情况(行为未定义)。
程序员不能在数组末尾读取或写入。