C - malloc() 用于结构中的指针,不要将内存绑定到声明的大小



我想绑定*float vec_valuestruct 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缓冲区)之外进行索引时的行为应该是什么。 编译器和运行时环境都不需要以任何特定方式处理这种情况(行为未定义)。

程序员不能在数组末尾读取或写入。

相关内容

  • 没有找到相关文章